diff --git a/.hgtags b/.hgtags index cfd1432dae0..aaf78d35e9c 100644 --- a/.hgtags +++ b/.hgtags @@ -284,3 +284,4 @@ b409bc51bc23cfd51f2bd04ea919ec83535af9d0 jdk9-b37 4e7c4d692e934cb9023af8201e7c2b510e9c4ee1 jdk9-b39 82f4cb44b2d7af2352f48568a64b7b6a5ae960cd jdk9-b40 9fffb959eb4197ff806e4ac12244761815b4deee jdk9-b41 +3107be2ba9c6e208a0b86bc7100a141abbc5b5fb jdk9-b42 diff --git a/.hgtags-top-repo b/.hgtags-top-repo index 3bd77e9484b..9cbf0f90d4e 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -284,3 +284,4 @@ d42c0a90afc3c66ca87543076ec9aafd4b4680de jdk9-b38 512dbbeb1730edcebfec873fc3f1455660b32000 jdk9-b39 cf136458ee747e151a27aa9ea0c1492ea55ef3e7 jdk9-b40 67395f7ca2db3b52e3a62a84888487de5cb9210a jdk9-b41 +f7c11da0b0481d49cc7a65a453336c108191e821 jdk9-b42 diff --git a/common/autoconf/boot-jdk.m4 b/common/autoconf/boot-jdk.m4 index 7c43fee4f03..c0f0c07b4c8 100644 --- a/common/autoconf/boot-jdk.m4 +++ b/common/autoconf/boot-jdk.m4 @@ -73,31 +73,25 @@ AC_DEFUN([BOOTJDK_DO_CHECK], AC_MSG_NOTICE([(This might be an JRE instead of an JDK)]) BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - AC_MSG_NOTICE([Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring]) + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + [FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'`] + if test "x$FOUND_CORRECT_VERSION" = x; then + AC_MSG_NOTICE([Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring]) + AC_MSG_NOTICE([(Your Boot JDK must be version 8 or 9)]) BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - [FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'`] - if test "x$FOUND_CORRECT_VERSION" = x; then - AC_MSG_NOTICE([Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring]) - AC_MSG_NOTICE([(Your Boot JDK must be version 8 or 9)]) - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes - BASIC_FIXUP_PATH(BOOT_JDK) - AC_MSG_CHECKING([for Boot JDK]) - AC_MSG_RESULT([$BOOT_JDK]) - AC_MSG_CHECKING([Boot JDK version]) - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - AC_MSG_RESULT([$BOOT_JDK_VERSION]) - fi # end check jdk version - fi # end check rt.jar + # We're done! :-) + BOOT_JDK_FOUND=yes + BASIC_FIXUP_PATH(BOOT_JDK) + AC_MSG_CHECKING([for Boot JDK]) + AC_MSG_RESULT([$BOOT_JDK]) + AC_MSG_CHECKING([Boot JDK version]) + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + AC_MSG_RESULT([$BOOT_JDK_VERSION]) + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh index 47172bfb91b..0b1567ce0ce 100644 --- a/common/autoconf/generated-configure.sh +++ b/common/autoconf/generated-configure.sh @@ -4329,7 +4329,7 @@ TOOLCHAIN_DESCRIPTION_xlc="IBM XL C/C++" #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1417630847 +DATE_WHEN_GENERATED=1418036274 ############################################################################### # @@ -20203,26 +20203,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -20345,17 +20339,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -20535,26 +20528,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -20677,17 +20664,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -20729,26 +20715,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -20871,17 +20851,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -20916,26 +20895,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -21058,17 +21031,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -21102,26 +21074,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -21244,17 +21210,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -21288,26 +21253,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -21430,17 +21389,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -21465,26 +21423,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -21607,17 +21559,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -21783,26 +21734,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -21925,17 +21870,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -22111,26 +22055,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -22253,17 +22191,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -22326,26 +22263,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -22468,17 +22399,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -22506,26 +22436,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -22648,17 +22572,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -22714,26 +22637,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -22856,17 +22773,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -22894,26 +22810,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -23036,17 +22946,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -23102,26 +23011,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -23244,17 +23147,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -23282,26 +23184,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -23424,17 +23320,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -23490,26 +23385,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -23632,17 +23521,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -23670,26 +23558,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -23812,17 +23694,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -23865,26 +23746,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -24007,17 +23882,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -24043,26 +23917,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -24185,17 +24053,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -24239,26 +24106,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -24381,17 +24242,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -24417,26 +24277,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -24559,17 +24413,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -24612,26 +24465,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -24754,17 +24601,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -24790,26 +24636,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -24932,17 +24772,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -24986,26 +24825,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -25128,17 +24961,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -25164,26 +24996,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -25306,17 +25132,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found @@ -25341,26 +25166,20 @@ $as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java $as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} BOOT_JDK_FOUND=no else - # Do we have an rt.jar? (On MacOSX it is called classes.jar) - if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` + if test "x$FOUND_CORRECT_VERSION" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} BOOT_JDK_FOUND=no else - # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` - - # Extra M4 quote needed to protect [] in grep expression. - FOUND_CORRECT_VERSION=`echo $BOOT_JDK_VERSION | grep '\"1\.[89]\.'` - if test "x$FOUND_CORRECT_VERSION" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 -$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 8 or 9)" >&5 -$as_echo "$as_me: (Your Boot JDK must be version 8 or 9)" >&6;} - BOOT_JDK_FOUND=no - else - # We're done! :-) - BOOT_JDK_FOUND=yes + # We're done! :-) + BOOT_JDK_FOUND=yes if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then @@ -25483,17 +25302,16 @@ $as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid. BOOT_JDK="`cd "$path"; $THEPWDCMD -L`" fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 $as_echo "$BOOT_JDK" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 $as_echo_n "checking Boot JDK version... " >&6; } - BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 $as_echo "$BOOT_JDK_VERSION" >&6; } - fi # end check jdk version - fi # end check rt.jar + fi # end check jdk version fi # end check javac fi # end check java fi # end check boot jdk found diff --git a/corba/.hgtags b/corba/.hgtags index 88827d2782a..26c65ed70d5 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -284,3 +284,4 @@ ffd90c81d4ef9d94d880fc852e2fc482ecd9b374 jdk9-b36 53bf36cb722db50815712258a77cb6bbe25a2f5f jdk9-b39 e27c725d6c9d155667b35255f442d4ceb8c3c084 jdk9-b40 1908b886ba1eda46fa725cf1160fe5d30fd1a7e5 jdk9-b41 +078bb11af876fe528d4b516f33ad4dd9bb60549e jdk9-b42 diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 159c2223842..ae7d006d45b 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -444,3 +444,4 @@ c363a8b87e477ee45d6d3cb2a36cb365141bc596 jdk9-b38 9cb75e5e394827ccbaf2e15524108a412dc4ddc5 jdk9-b39 6b09b3193d731e3288e2a240c504a20d0a06c766 jdk9-b40 1d29b13e8a515a7ea3b882f140576d5d675bc11f jdk9-b41 +38cb4fbd47e3472bd1b5ebac83bda96fe4869c4f jdk9-b42 diff --git a/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp b/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp index a0d54665375..63da256a7a9 100644 --- a/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp +++ b/hotspot/src/cpu/x86/vm/c1_Runtime1_x86.cpp @@ -675,7 +675,7 @@ OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler *sasm) { case handle_exception_nofpu_id: case handle_exception_id: // At this point all registers MAY be live. - oop_map = save_live_registers(sasm, 1 /*thread*/, id == handle_exception_nofpu_id); + oop_map = save_live_registers(sasm, 1 /*thread*/, id != handle_exception_nofpu_id); break; case handle_exception_from_callee_id: { // At this point all registers except exception oop (RAX) and @@ -748,7 +748,7 @@ OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler *sasm) { case handle_exception_nofpu_id: case handle_exception_id: // Restore the registers that were saved at the beginning. - restore_live_registers(sasm, id == handle_exception_nofpu_id); + restore_live_registers(sasm, id != handle_exception_nofpu_id); break; case handle_exception_from_callee_id: // WIN64_ONLY: No need to add frame::arg_reg_save_area_bytes to SP diff --git a/hotspot/src/os/aix/vm/os_aix.cpp b/hotspot/src/os/aix/vm/os_aix.cpp index 3f14161d7b0..2a77a9e80f6 100644 --- a/hotspot/src/os/aix/vm/os_aix.cpp +++ b/hotspot/src/os/aix/vm/os_aix.cpp @@ -4144,8 +4144,29 @@ int os::available(int fd, jlong *bytes) { 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; + int prot; + int flags = MAP_PRIVATE; + + if (read_only) { + prot = PROT_READ; + } else { + prot = PROT_READ | PROT_WRITE; + } + + if (allow_exec) { + prot |= PROT_EXEC; + } + + if (addr != NULL) { + flags |= MAP_FIXED; + } + + char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags, + fd, file_offset); + if (mapped_address == MAP_FAILED) { + return NULL; + } + return mapped_address; } diff --git a/hotspot/src/share/vm/classfile/classFileParser.cpp b/hotspot/src/share/vm/classfile/classFileParser.cpp index 7d54c6e2ed6..f80d0fcc00e 100644 --- a/hotspot/src/share/vm/classfile/classFileParser.cpp +++ b/hotspot/src/share/vm/classfile/classFileParser.cpp @@ -3108,21 +3108,39 @@ void ClassFileParser::apply_parsed_class_attributes(instanceKlassHandle k) { } } -// Transfer ownership of metadata allocated to the InstanceKlass. -void ClassFileParser::apply_parsed_class_metadata( - instanceKlassHandle this_klass, - int java_fields_count, TRAPS) { - // Assign annotations if needed - if (_annotations != NULL || _type_annotations != NULL || - _fields_annotations != NULL || _fields_type_annotations != NULL) { +// Create the Annotations object that will +// hold the annotations array for the Klass. +void ClassFileParser::create_combined_annotations(TRAPS) { + if (_annotations == NULL && + _type_annotations == NULL && + _fields_annotations == NULL && + _fields_type_annotations == NULL) { + // Don't create the Annotations object unnecessarily. + return; + } + Annotations* annotations = Annotations::allocate(_loader_data, CHECK); annotations->set_class_annotations(_annotations); annotations->set_class_type_annotations(_type_annotations); annotations->set_fields_annotations(_fields_annotations); annotations->set_fields_type_annotations(_fields_type_annotations); - this_klass->set_annotations(annotations); - } + // This is the Annotations object that will be + // assigned to InstanceKlass being constructed. + _combined_annotations = annotations; + + // The annotations arrays below has been transfered the + // _combined_annotations so these fields can now be cleared. + _annotations = NULL; + _type_annotations = NULL; + _fields_annotations = NULL; + _fields_type_annotations = NULL; +} + +// Transfer ownership of metadata allocated to the InstanceKlass. +void ClassFileParser::apply_parsed_class_metadata( + instanceKlassHandle this_klass, + int java_fields_count, TRAPS) { _cp->set_pool_holder(this_klass()); this_klass->set_constants(_cp); this_klass->set_fields(_fields, java_fields_count); @@ -3130,6 +3148,7 @@ void ClassFileParser::apply_parsed_class_metadata( this_klass->set_inner_classes(_inner_classes); this_klass->set_local_interfaces(_local_interfaces); this_klass->set_transitive_interfaces(_transitive_interfaces); + this_klass->set_annotations(_combined_annotations); // Clear out these fields so they don't get deallocated by the destructor clear_class_metadata(); @@ -4002,6 +4021,10 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, ClassAnnotationCollector parsed_annotations; parse_classfile_attributes(&parsed_annotations, CHECK_(nullHandle)); + // Finalize the Annotations metadata object, + // now that all annotation arrays have been created. + create_combined_annotations(CHECK_(nullHandle)); + // Make sure this is the end of class file stream guarantee_property(cfs->at_eos(), "Extra bytes at the end of class file %s", CHECK_(nullHandle)); @@ -4302,10 +4325,27 @@ ClassFileParser::~ClassFileParser() { InstanceKlass::deallocate_interfaces(_loader_data, _super_klass(), _local_interfaces, _transitive_interfaces); - MetadataFactory::free_array(_loader_data, _annotations); - MetadataFactory::free_array(_loader_data, _type_annotations); - Annotations::free_contents(_loader_data, _fields_annotations); - Annotations::free_contents(_loader_data, _fields_type_annotations); + if (_combined_annotations != NULL) { + // After all annotations arrays have been created, they are installed into the + // Annotations object that will be assigned to the InstanceKlass being created. + + // Deallocate the Annotations object and the installed annotations arrays. + _combined_annotations->deallocate_contents(_loader_data); + + // If the _combined_annotations pointer is non-NULL, + // then the other annotations fields should have been cleared. + assert(_annotations == NULL, "Should have been cleared"); + assert(_type_annotations == NULL, "Should have been cleared"); + assert(_fields_annotations == NULL, "Should have been cleared"); + assert(_fields_type_annotations == NULL, "Should have been cleared"); + } else { + // If the annotations arrays were not installed into the Annotations object, + // then they have to be deallocated explicitly. + MetadataFactory::free_array(_loader_data, _annotations); + MetadataFactory::free_array(_loader_data, _type_annotations); + Annotations::free_contents(_loader_data, _fields_annotations); + Annotations::free_contents(_loader_data, _fields_type_annotations); + } clear_class_metadata(); diff --git a/hotspot/src/share/vm/classfile/classFileParser.hpp b/hotspot/src/share/vm/classfile/classFileParser.hpp index b2efa8ceba3..c3d23df881c 100644 --- a/hotspot/src/share/vm/classfile/classFileParser.hpp +++ b/hotspot/src/share/vm/classfile/classFileParser.hpp @@ -75,6 +75,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC { Array* _inner_classes; Array* _local_interfaces; Array* _transitive_interfaces; + Annotations* _combined_annotations; AnnotationArray* _annotations; AnnotationArray* _type_annotations; Array* _fields_annotations; @@ -86,6 +87,8 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC { void set_class_generic_signature_index(u2 x) { _generic_signature_index = x; } void set_class_sde_buffer(char* x, int len) { _sde_buffer = x; _sde_length = len; } + void create_combined_annotations(TRAPS); + void init_parsed_class_attributes(ClassLoaderData* loader_data) { _loader_data = loader_data; _synthetic_flag = false; @@ -110,6 +113,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC { _inner_classes = NULL; _local_interfaces = NULL; _transitive_interfaces = NULL; + _combined_annotations = NULL; _annotations = _type_annotations = NULL; _fields_annotations = _fields_type_annotations = NULL; } diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp index ba9a73e1da7..d9d5943b4f0 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @@ -795,11 +795,6 @@ void ConcurrentMarkSweepGeneration::promotion_failure_occurred() { } } -CompactibleSpace* -ConcurrentMarkSweepGeneration::first_compaction_space() const { - return _cmsSpace; -} - void ConcurrentMarkSweepGeneration::reset_after_compaction() { // Clear the promotion information. These pointers can be adjusted // along with all the other pointers into the heap but @@ -810,10 +805,6 @@ void ConcurrentMarkSweepGeneration::reset_after_compaction() { } } -void ConcurrentMarkSweepGeneration::space_iterate(SpaceClosure* blk, bool usedOnly) { - blk->do_space(_cmsSpace); -} - void ConcurrentMarkSweepGeneration::compute_new_size() { assert_locked_or_safepoint(Heap_lock); @@ -884,7 +875,7 @@ void ConcurrentMarkSweepGeneration::compute_new_size_free_list() { expand_bytes); } // safe if expansion fails - expand(expand_bytes, 0, CMSExpansionCause::_satisfy_free_ratio); + expand_for_gc_cause(expand_bytes, 0, CMSExpansionCause::_satisfy_free_ratio); if (PrintGCDetails && Verbose) { gclog_or_tty->print_cr(" Expanded free fraction %f", ((double) free()) / capacity()); @@ -1050,8 +1041,7 @@ oop ConcurrentMarkSweepGeneration::promote(oop obj, size_t obj_size) { if (res == NULL) { // expand and retry size_t s = _cmsSpace->expansionSpaceRequired(obj_size); // HeapWords - expand(s*HeapWordSize, MinHeapDeltaBytes, - CMSExpansionCause::_satisfy_promotion); + expand_for_gc_cause(s*HeapWordSize, MinHeapDeltaBytes, CMSExpansionCause::_satisfy_promotion); // Since there's currently no next generation, we don't try to promote // into a more senior generation. assert(next_gen() == NULL, "assumption, based upon which no attempt " @@ -2626,13 +2616,6 @@ oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl) { \ ALL_SINCE_SAVE_MARKS_CLOSURES(CMS_SINCE_SAVE_MARKS_DEFN) -void -ConcurrentMarkSweepGeneration::younger_refs_iterate(OopsInGenClosure* cl) { - cl->set_generation(this); - younger_refs_in_space_iterate(_cmsSpace, cl); - cl->reset_generation(); -} - void ConcurrentMarkSweepGeneration::oop_iterate(ExtendedOopClosure* cl) { if (freelistLock()->owned_by_self()) { @@ -2805,23 +2788,17 @@ ConcurrentMarkSweepGeneration::expand_and_allocate(size_t word_size, CMSSynchronousYieldRequest yr; assert(!tlab, "Can't deal with TLAB allocation"); MutexLockerEx x(freelistLock(), Mutex::_no_safepoint_check_flag); - expand(word_size*HeapWordSize, MinHeapDeltaBytes, - CMSExpansionCause::_satisfy_allocation); + expand_for_gc_cause(word_size*HeapWordSize, MinHeapDeltaBytes, CMSExpansionCause::_satisfy_allocation); if (GCExpandToAllocateDelayMillis > 0) { os::sleep(Thread::current(), GCExpandToAllocateDelayMillis, false); } return have_lock_and_allocate(word_size, tlab); } -// YSR: All of this generation expansion/shrinking stuff is an exact copy of -// TenuredGeneration, which makes me wonder if we should move this -// to CardGeneration and share it... -bool ConcurrentMarkSweepGeneration::expand(size_t bytes, size_t expand_bytes) { - return CardGeneration::expand(bytes, expand_bytes); -} - -void ConcurrentMarkSweepGeneration::expand(size_t bytes, size_t expand_bytes, - CMSExpansionCause::Cause cause) +void ConcurrentMarkSweepGeneration::expand_for_gc_cause( + size_t bytes, + size_t expand_bytes, + CMSExpansionCause::Cause cause) { bool success = expand(bytes, expand_bytes); @@ -2850,8 +2827,7 @@ HeapWord* ConcurrentMarkSweepGeneration::expand_and_par_lab_allocate(CMSParGCThr return NULL; } // Otherwise, we try expansion. - expand(word_sz*HeapWordSize, MinHeapDeltaBytes, - CMSExpansionCause::_allocate_par_lab); + expand_for_gc_cause(word_sz*HeapWordSize, MinHeapDeltaBytes, CMSExpansionCause::_allocate_par_lab); // Now go around the loop and try alloc again; // A competing par_promote might beat us to the expansion space, // so we may go around the loop again if promotion fails again. @@ -2878,8 +2854,7 @@ bool ConcurrentMarkSweepGeneration::expand_and_ensure_spooling_space( return false; } // Otherwise, we try expansion. - expand(refill_size_bytes, MinHeapDeltaBytes, - CMSExpansionCause::_allocate_par_spooling_space); + expand_for_gc_cause(refill_size_bytes, MinHeapDeltaBytes, CMSExpansionCause::_allocate_par_spooling_space); // Now go around the loop and try alloc again; // A competing allocation might beat us to the expansion space, // so we may go around the loop again if allocation fails again. @@ -2889,77 +2864,16 @@ bool ConcurrentMarkSweepGeneration::expand_and_ensure_spooling_space( } } - -void ConcurrentMarkSweepGeneration::shrink_by(size_t bytes) { - assert_locked_or_safepoint(ExpandHeap_lock); - // Shrink committed space - _virtual_space.shrink_by(bytes); - // Shrink space; this also shrinks the space's BOT - _cmsSpace->set_end((HeapWord*) _virtual_space.high()); - size_t new_word_size = heap_word_size(_cmsSpace->capacity()); - // Shrink the shared block offset array - _bts->resize(new_word_size); - MemRegion mr(_cmsSpace->bottom(), new_word_size); - // Shrink the card table - Universe::heap()->barrier_set()->resize_covered_region(mr); - - if (Verbose && PrintGC) { - size_t new_mem_size = _virtual_space.committed_size(); - size_t old_mem_size = new_mem_size + bytes; - gclog_or_tty->print_cr("Shrinking %s from " SIZE_FORMAT "K to " SIZE_FORMAT "K", - name(), old_mem_size/K, new_mem_size/K); - } -} - void ConcurrentMarkSweepGeneration::shrink(size_t bytes) { - assert_locked_or_safepoint(Heap_lock); - size_t size = ReservedSpace::page_align_size_down(bytes); // Only shrink if a compaction was done so that all the free space // in the generation is in a contiguous block at the end. - if (size > 0 && did_compact()) { - shrink_by(size); + if (did_compact()) { + CardGeneration::shrink(bytes); } } -bool ConcurrentMarkSweepGeneration::grow_by(size_t bytes) { +void ConcurrentMarkSweepGeneration::assert_correct_size_change_locking() { assert_locked_or_safepoint(Heap_lock); - bool result = _virtual_space.expand_by(bytes); - if (result) { - size_t new_word_size = - heap_word_size(_virtual_space.committed_size()); - MemRegion mr(_cmsSpace->bottom(), new_word_size); - _bts->resize(new_word_size); // resize the block offset shared array - Universe::heap()->barrier_set()->resize_covered_region(mr); - // Hmmmm... why doesn't CFLS::set_end verify locking? - // This is quite ugly; FIX ME XXX - _cmsSpace->assert_locked(freelistLock()); - _cmsSpace->set_end((HeapWord*)_virtual_space.high()); - - // update the space and generation capacity counters - if (UsePerfData) { - _space_counters->update_capacity(); - _gen_counters->update_all(); - } - - if (Verbose && PrintGC) { - size_t new_mem_size = _virtual_space.committed_size(); - size_t old_mem_size = new_mem_size - bytes; - gclog_or_tty->print_cr("Expanding %s from " SIZE_FORMAT "K by " SIZE_FORMAT "K to " SIZE_FORMAT "K", - name(), old_mem_size/K, bytes/K, new_mem_size/K); - } - } - return result; -} - -bool ConcurrentMarkSweepGeneration::grow_to_reserved() { - assert_locked_or_safepoint(Heap_lock); - bool success = true; - const size_t remaining_bytes = _virtual_space.uncommitted_size(); - if (remaining_bytes > 0) { - success = grow_by(remaining_bytes); - DEBUG_ONLY(if (!success) warning("grow to reserved failed");) - } - return success; } void ConcurrentMarkSweepGeneration::shrink_free_list_by(size_t bytes) { diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp index 202c6730ae7..3ca036494d4 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.hpp @@ -30,9 +30,10 @@ #include "gc_implementation/shared/gcStats.hpp" #include "gc_implementation/shared/gcWhen.hpp" #include "gc_implementation/shared/generationCounters.hpp" +#include "memory/cardGeneration.hpp" #include "memory/freeBlockDictionary.hpp" -#include "memory/generation.hpp" #include "memory/iterator.hpp" +#include "memory/space.hpp" #include "runtime/mutexLocker.hpp" #include "runtime/virtualspace.hpp" #include "services/memoryService.hpp" @@ -171,9 +172,7 @@ class CMSBitMap VALUE_OBJ_CLASS_SPEC { // Represents a marking stack used by the CMS collector. // Ideally this should be GrowableArray<> just like MSC's marking stack(s). class CMSMarkStack: public CHeapObj { - // friend class CMSCollector; // To get at expansion stats further below. - // VirtualSpace _virtual_space; // Space for the stack oop* _base; // Bottom of stack @@ -1032,6 +1031,9 @@ class ConcurrentMarkSweepGeneration: public CardGeneration { void set_expansion_cause(CMSExpansionCause::Cause v) { _expansion_cause = v;} CMSExpansionCause::Cause expansion_cause() const { return _expansion_cause; } + // Accessing spaces + CompactibleSpace* space() const { return (CompactibleSpace*)_cmsSpace; } + private: // For parallel young-gen GC support. CMSParGCThreadState** _par_gc_thread_states; @@ -1065,6 +1067,10 @@ class ConcurrentMarkSweepGeneration: public CardGeneration { double initiating_occupancy() const { return _initiating_occupancy; } void init_initiating_occupancy(intx io, uintx tr); + void expand_for_gc_cause(size_t bytes, size_t expand_bytes, CMSExpansionCause::Cause cause); + + void assert_correct_size_change_locking(); + public: ConcurrentMarkSweepGeneration(ReservedSpace rs, size_t initial_byte_size, int level, CardTableRS* ct, @@ -1101,23 +1107,14 @@ class ConcurrentMarkSweepGeneration: public CardGeneration { // Override virtual void ref_processor_init(); - // Grow generation by specified size (returns false if unable to grow) - bool grow_by(size_t bytes); - // Grow generation to reserved size. - bool grow_to_reserved(); - void clear_expansion_cause() { _expansion_cause = CMSExpansionCause::_no_expansion; } // Space enquiries - size_t capacity() const; - size_t used() const; - size_t free() const; double occupancy() const { return ((double)used())/((double)capacity()); } size_t contiguous_available() const; size_t unsafe_max_alloc_nogc() const; // over-rides - MemRegion used_region() const; MemRegion used_region_at_save_marks() const; // Does a "full" (forced) collection invoked on this generation collect @@ -1128,10 +1125,6 @@ class ConcurrentMarkSweepGeneration: public CardGeneration { return !ScavengeBeforeFullGC; } - void space_iterate(SpaceClosure* blk, bool usedOnly = false); - - // Support for compaction - CompactibleSpace* first_compaction_space() const; // Adjust quantities in the generation affected by // the compaction. void reset_after_compaction(); @@ -1191,18 +1184,13 @@ class ConcurrentMarkSweepGeneration: public CardGeneration { } // Allocation failure - void expand(size_t bytes, size_t expand_bytes, - CMSExpansionCause::Cause cause); - virtual bool expand(size_t bytes, size_t expand_bytes); void shrink(size_t bytes); - void shrink_by(size_t bytes); HeapWord* expand_and_par_lab_allocate(CMSParGCThreadState* ps, size_t word_sz); bool expand_and_ensure_spooling_space(PromotionInfo* promo); // Iteration support and related enquiries void save_marks(); bool no_allocs_since_save_marks(); - void younger_refs_iterate(OopsInGenClosure* cl); // Iteration support specific to CMS generations void save_sweep_limit(); diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.inline.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.inline.hpp index dc76d1bc884..bc552f78420 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.inline.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.inline.hpp @@ -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 @@ -369,22 +369,6 @@ inline void ConcurrentMarkSweepGeneration::save_sweep_limit() { cmsSpace()->save_sweep_limit(); } -inline size_t ConcurrentMarkSweepGeneration::capacity() const { - return _cmsSpace->capacity(); -} - -inline size_t ConcurrentMarkSweepGeneration::used() const { - return _cmsSpace->used(); -} - -inline size_t ConcurrentMarkSweepGeneration::free() const { - return _cmsSpace->free(); -} - -inline MemRegion ConcurrentMarkSweepGeneration::used_region() const { - return _cmsSpace->used_region(); -} - inline MemRegion ConcurrentMarkSweepGeneration::used_region_at_save_marks() const { return _cmsSpace->used_region_at_save_marks(); } diff --git a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp index 37b3202dbdc..cc5c7ee84b5 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/g1CollectedHeap.cpp @@ -352,7 +352,7 @@ void YoungList::print() { } void G1RegionMappingChangedListener::reset_from_card_cache(uint start_idx, size_t num_regions) { - OtherRegionsTable::invalidate(start_idx, num_regions); + HeapRegionRemSet::invalidate_from_card_cache(start_idx, num_regions); } void G1RegionMappingChangedListener::on_commit(uint start_idx, size_t num_regions, bool zero_filled) { diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp index 27254cbe28f..9551aed3022 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.cpp @@ -407,20 +407,8 @@ void FromCardCache::clear(uint region_idx) { } } -void OtherRegionsTable::initialize(uint max_regions) { - FromCardCache::initialize(HeapRegionRemSet::num_par_rem_sets(), max_regions); -} - -void OtherRegionsTable::invalidate(uint start_idx, size_t num_regions) { - FromCardCache::invalidate(start_idx, num_regions); -} - -void OtherRegionsTable::print_from_card_cache() { - FromCardCache::print(); -} - void OtherRegionsTable::add_reference(OopOrNarrowOopStar from, uint tid) { - uint cur_hrm_ind = hr()->hrm_index(); + uint cur_hrm_ind = _hr->hrm_index(); if (G1TraceHeapRegionRememberedSet) { gclog_or_tty->print_cr("ORT::add_reference_work(" PTR_FORMAT "->" PTR_FORMAT ").", @@ -434,7 +422,7 @@ void OtherRegionsTable::add_reference(OopOrNarrowOopStar from, uint tid) { if (G1TraceHeapRegionRememberedSet) { gclog_or_tty->print_cr("Table for [" PTR_FORMAT "...): card %d (cache = %d)", - hr()->bottom(), from_card, + _hr->bottom(), from_card, FromCardCache::at(tid, cur_hrm_ind)); } @@ -477,13 +465,13 @@ void OtherRegionsTable::add_reference(OopOrNarrowOopStar from, uint tid) { if (G1HRRSUseSparseTable && _sparse_table.add_card(from_hrm_ind, card_index)) { if (G1RecordHRRSOops) { - HeapRegionRemSet::record(hr(), from); + HeapRegionRemSet::record(_hr, from); if (G1TraceHeapRegionRememberedSet) { gclog_or_tty->print(" Added card " PTR_FORMAT " to region " "[" PTR_FORMAT "...) for ref " PTR_FORMAT ".\n", align_size_down(uintptr_t(from), CardTableModRefBS::card_size), - hr()->bottom(), from); + _hr->bottom(), from); } } if (G1TraceHeapRegionRememberedSet) { @@ -539,13 +527,13 @@ void OtherRegionsTable::add_reference(OopOrNarrowOopStar from, uint tid) { prt->add_reference(from); if (G1RecordHRRSOops) { - HeapRegionRemSet::record(hr(), from); + HeapRegionRemSet::record(_hr, from); if (G1TraceHeapRegionRememberedSet) { gclog_or_tty->print("Added card " PTR_FORMAT " to region " "[" PTR_FORMAT "...) for ref " PTR_FORMAT ".\n", align_size_down(uintptr_t(from), CardTableModRefBS::card_size), - hr()->bottom(), from); + _hr->bottom(), from); } } assert(contains_reference(from), "We just added it!"); @@ -614,7 +602,7 @@ PerRegionTable* OtherRegionsTable::delete_region_table() { if (G1TraceHeapRegionRememberedSet) { gclog_or_tty->print("Coarsened entry in region [" PTR_FORMAT "...] " "for region [" PTR_FORMAT "...] (" SIZE_FORMAT " coarse entries).\n", - hr()->bottom(), + _hr->bottom(), max->hr()->bottom(), _n_coarse_entries); } @@ -627,13 +615,11 @@ PerRegionTable* OtherRegionsTable::delete_region_table() { return max; } - -// At present, this must be called stop-world single-threaded. void OtherRegionsTable::scrub(CardTableModRefBS* ctbs, BitMap* region_bm, BitMap* card_bm) { // First eliminated garbage regions from the coarse map. if (G1RSScrubVerbose) { - gclog_or_tty->print_cr("Scrubbing region %u:", hr()->hrm_index()); + gclog_or_tty->print_cr("Scrubbing region %u:", _hr->hrm_index()); } assert(_coarse_map.size() == region_bm->size(), "Precondition"); @@ -752,7 +738,7 @@ size_t OtherRegionsTable::fl_mem_size() { } void OtherRegionsTable::clear_fcc() { - FromCardCache::clear(hr()->hrm_index()); + FromCardCache::clear(_hr->hrm_index()); } void OtherRegionsTable::clear() { @@ -774,27 +760,6 @@ void OtherRegionsTable::clear() { clear_fcc(); } -bool OtherRegionsTable::del_single_region_table(size_t ind, - HeapRegion* hr) { - assert(0 <= ind && ind < _max_fine_entries, "Preconditions."); - PerRegionTable** prev_addr = &_fine_grain_regions[ind]; - PerRegionTable* prt = *prev_addr; - while (prt != NULL && prt->hr() != hr) { - prev_addr = prt->collision_list_next_addr(); - prt = prt->collision_list_next(); - } - if (prt != NULL) { - assert(prt->hr() == hr, "Loop postcondition."); - *prev_addr = prt->collision_list_next(); - unlink_from_all(prt); - PerRegionTable::free(prt); - _n_fine_entries--; - return true; - } else { - return false; - } -} - bool OtherRegionsTable::contains_reference(OopOrNarrowOopStar from) const { // Cast away const in this case. MutexLockerEx x((Mutex*)_m, Mutex::_no_safepoint_check_flag); @@ -975,7 +940,7 @@ HeapRegionRemSetIterator:: HeapRegionRemSetIterator(HeapRegionRemSet* hrrs) : _hrrs(hrrs), _g1h(G1CollectedHeap::heap()), _coarse_map(&hrrs->_other_regions._coarse_map), - _bosa(hrrs->bosa()), + _bosa(hrrs->_bosa), _is(Sparse), // Set these values so that we increment to the first region. _coarse_cur_region_index(-1), diff --git a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp index d55fe1858df..bfff90abaef 100644 --- a/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp +++ b/hotspot/src/share/vm/gc_implementation/g1/heapRegionRemSet.hpp @@ -162,32 +162,36 @@ class OtherRegionsTable VALUE_OBJ_CLASS_SPEC { // to hold _m, and the fine-grain table to be full. PerRegionTable* delete_region_table(); - // If a PRT for "hr" is in the bucket list indicated by "ind" (which must - // be the correct index for "hr"), delete it and return true; else return - // false. - bool del_single_region_table(size_t ind, HeapRegion* hr); - // 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, Mutex* m); + bool contains_reference_locked(OopOrNarrowOopStar from) const; - HeapRegion* hr() const { return _hr; } + // Clear the from_card_cache entries for this region. + void clear_fcc(); +public: + // Create a new remembered set for the given heap region. The given mutex should + // be used to ensure consistency. + OtherRegionsTable(HeapRegion* hr, Mutex* m); // For now. Could "expand" some tables in the future, so that this made // sense. void add_reference(OopOrNarrowOopStar from, uint tid); + // Returns whether the remembered set contains the given reference. + bool contains_reference(OopOrNarrowOopStar from) const; + // Removes any entries shown by the given bitmaps to contain only dead - // objects. + // objects. Not thread safe. + // Set bits in the bitmaps indicate that the given region or card is live. void scrub(CardTableModRefBS* ctbs, BitMap* region_bm, BitMap* card_bm); - // Returns whether this remembered set (and all sub-sets) contain no entries. + // Returns whether this remembered set (and all sub-sets) does not contain any entry. bool is_empty() const; + // Returns the number of cards contained in this remembered set. size_t occupied() const; size_t occ_fine() const; size_t occ_coarse() const; @@ -195,31 +199,17 @@ public: static jint n_coarsenings() { return _n_coarsenings; } - // Returns size in bytes. - // Not const because it takes a lock. + // Returns size of the actual remembered set containers in bytes. size_t mem_size() const; + // Returns the size of static data in bytes. static size_t static_mem_size(); + // Returns the size of the free list content in bytes. static size_t fl_mem_size(); - bool contains_reference(OopOrNarrowOopStar from) const; - bool contains_reference_locked(OopOrNarrowOopStar from) const; - + // Clear the entire contents of this remembered set. void clear(); - // Specifically clear the from_card_cache. - void clear_fcc(); - void do_cleanup_work(HRRSCleanupTask* hrrs_cleanup_task); - - // Declare the heap size (in # of regions) to the OtherRegionsTable. - // (Uses it to initialize from_card_cache). - static void initialize(uint max_regions); - - // Declares that regions between start_idx <= i < start_idx + num_regions are - // not in use. Make sure that any entries for these regions are invalid. - static void invalidate(uint start_idx, size_t num_regions); - - static void print_from_card_cache(); }; class HeapRegionRemSet : public CHeapObj { @@ -233,7 +223,6 @@ public: private: G1BlockOffsetSharedArray* _bosa; - G1BlockOffsetSharedArray* bosa() const { return _bosa; } // A set of code blobs (nmethods) whose code contains pointers into // the region that owns this RSet. @@ -268,10 +257,6 @@ public: static uint num_par_rem_sets(); static void setup_remset_size(); - HeapRegion* hr() const { - return _other_regions.hr(); - } - bool is_empty() const { return (strong_code_roots_list_length() == 0) && _other_regions.is_empty(); } @@ -305,8 +290,9 @@ public: _other_regions.add_reference(from, tid); } - // Removes any entries shown by the given bitmaps to contain only dead - // objects. + // Removes any entries in the remembered set shown by the given bitmaps to + // contain only dead objects. Not thread safe. + // One bits in the bitmaps indicate that the given region or card is live. void scrub(CardTableModRefBS* ctbs, BitMap* region_bm, BitMap* card_bm); // The region is being reclaimed; clear its remset, and any mention of @@ -397,16 +383,16 @@ public: // 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::initialize(max_regions); + FromCardCache::initialize(num_par_rem_sets(), max_regions); } - static void invalidate(uint start_idx, uint num_regions) { - OtherRegionsTable::invalidate(start_idx, num_regions); + static void invalidate_from_card_cache(uint start_idx, size_t num_regions) { + FromCardCache::invalidate(start_idx, num_regions); } #ifndef PRODUCT static void print_from_card_cache() { - OtherRegionsTable::print_from_card_cache(); + FromCardCache::print(); } #endif diff --git a/hotspot/src/share/vm/gc_implementation/shared/gcTrace.cpp b/hotspot/src/share/vm/gc_implementation/shared/gcTrace.cpp index dba0c5f709b..79af8d24eb4 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/gcTrace.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/gcTrace.cpp @@ -172,6 +172,27 @@ void YoungGCTracer::report_tenuring_threshold(const uint tenuring_threshold) { _tenuring_threshold = tenuring_threshold; } +bool YoungGCTracer::should_report_promotion_in_new_plab_event() const { + return should_send_promotion_in_new_plab_event(); +} + +bool YoungGCTracer::should_report_promotion_outside_plab_event() const { + return should_send_promotion_outside_plab_event(); +} + +void YoungGCTracer::report_promotion_in_new_plab_event(Klass* klass, size_t obj_size, + uint age, bool tenured, + size_t plab_size) const { + assert_set_gc_id(); + send_promotion_in_new_plab_event(klass, obj_size, age, tenured, plab_size); +} + +void YoungGCTracer::report_promotion_outside_plab_event(Klass* klass, size_t obj_size, + uint age, bool tenured) const { + assert_set_gc_id(); + send_promotion_outside_plab_event(klass, obj_size, age, tenured); +} + void OldGCTracer::report_gc_end_impl(const Ticks& timestamp, TimePartitions* time_partitions) { assert_set_gc_id(); diff --git a/hotspot/src/share/vm/gc_implementation/shared/gcTrace.hpp b/hotspot/src/share/vm/gc_implementation/shared/gcTrace.hpp index 20342ebc244..9774dcb9537 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/gcTrace.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/gcTrace.hpp @@ -156,9 +156,38 @@ class YoungGCTracer : public GCTracer { void report_promotion_failed(const PromotionFailedInfo& pf_info); void report_tenuring_threshold(const uint tenuring_threshold); + /* + * Methods for reporting Promotion in new or outside PLAB Events. + * + * The object age is always required as it is not certain that the mark word + * of the oop can be trusted at this stage. + * + * obj_size is the size of the promoted object in bytes. + * + * tenured should be true if the object has been promoted to the old + * space during this GC, if the object is copied to survivor space + * from young space or survivor space (aging) tenured should be false. + * + * plab_size is the size of the newly allocated PLAB in bytes. + */ + bool should_report_promotion_in_new_plab_event() const; + bool should_report_promotion_outside_plab_event() const; + void report_promotion_in_new_plab_event(Klass* klass, size_t obj_size, + uint age, bool tenured, + size_t plab_size) const; + void report_promotion_outside_plab_event(Klass* klass, size_t obj_size, + uint age, bool tenured) const; + private: void send_young_gc_event() const; void send_promotion_failed_event(const PromotionFailedInfo& pf_info) const; + bool should_send_promotion_in_new_plab_event() const; + bool should_send_promotion_outside_plab_event() const; + void send_promotion_in_new_plab_event(Klass* klass, size_t obj_size, + uint age, bool tenured, + size_t plab_size) const; + void send_promotion_outside_plab_event(Klass* klass, size_t obj_size, + uint age, bool tenured) const; }; class OldGCTracer : public GCTracer { diff --git a/hotspot/src/share/vm/gc_implementation/shared/gcTraceSend.cpp b/hotspot/src/share/vm/gc_implementation/shared/gcTraceSend.cpp index 97055694fae..326625bf1a8 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/gcTraceSend.cpp +++ b/hotspot/src/share/vm/gc_implementation/shared/gcTraceSend.cpp @@ -111,6 +111,44 @@ void YoungGCTracer::send_young_gc_event() const { } } +bool YoungGCTracer::should_send_promotion_in_new_plab_event() const { + return EventPromoteObjectInNewPLAB::is_enabled(); +} + +bool YoungGCTracer::should_send_promotion_outside_plab_event() const { + return EventPromoteObjectOutsidePLAB::is_enabled(); +} + +void YoungGCTracer::send_promotion_in_new_plab_event(Klass* klass, size_t obj_size, + uint age, bool tenured, + size_t plab_size) const { + + EventPromoteObjectInNewPLAB event; + if (event.should_commit()) { + event.set_gcId(_shared_gc_info.gc_id().id()); + event.set_class(klass); + event.set_objectSize(obj_size); + event.set_tenured(tenured); + event.set_tenuringAge(age); + event.set_plabSize(plab_size); + event.commit(); + } +} + +void YoungGCTracer::send_promotion_outside_plab_event(Klass* klass, size_t obj_size, + uint age, bool tenured) const { + + EventPromoteObjectOutsidePLAB event; + if (event.should_commit()) { + event.set_gcId(_shared_gc_info.gc_id().id()); + event.set_class(klass); + event.set_objectSize(obj_size); + event.set_tenured(tenured); + event.set_tenuringAge(age); + event.commit(); + } +} + void OldGCTracer::send_old_gc_event() const { EventGCOldGarbageCollection e(UNTIMED); if (e.should_commit()) { diff --git a/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp b/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp index 53be23d848b..1363b555132 100644 --- a/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp +++ b/hotspot/src/share/vm/interpreter/interpreterRuntime.cpp @@ -385,6 +385,18 @@ IRT_ENTRY(address, InterpreterRuntime::exception_handler_for_exception(JavaThrea int handler_bci; int current_bci = bci(thread); + if (thread->frames_to_pop_failed_realloc() > 0) { + // Allocation of scalar replaced object used in this frame + // failed. Unconditionally pop the frame. + thread->dec_frames_to_pop_failed_realloc(); + thread->set_vm_result(h_exception()); + // If the method is synchronized we already unlocked the monitor + // during deoptimization so the interpreter needs to skip it when + // the frame is popped. + thread->set_do_not_unlock_if_synchronized(true); + return Interpreter::remove_activation_entry(); + } + // Need to do this check first since when _do_not_unlock_if_synchronized // is set, we don't want to trigger any classloading which may make calls // into java, or surprisingly find a matching exception handler for bci 0 diff --git a/hotspot/src/share/vm/memory/cardGeneration.cpp b/hotspot/src/share/vm/memory/cardGeneration.cpp new file mode 100644 index 00000000000..21e8d9e51a7 --- /dev/null +++ b/hotspot/src/share/vm/memory/cardGeneration.cpp @@ -0,0 +1,360 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please 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/blockOffsetTable.inline.hpp" +#include "memory/cardGeneration.inline.hpp" +#include "memory/gcLocker.hpp" +#include "memory/generationSpec.hpp" +#include "memory/genOopClosures.inline.hpp" +#include "memory/genRemSet.hpp" +#include "memory/iterator.hpp" +#include "memory/memRegion.hpp" +#include "memory/space.inline.hpp" +#include "runtime/java.hpp" + +CardGeneration::CardGeneration(ReservedSpace rs, size_t initial_byte_size, + int level, + GenRemSet* remset) : + Generation(rs, initial_byte_size, level), _rs(remset), + _shrink_factor(0), _min_heap_delta_bytes(), _capacity_at_prologue(), + _used_at_prologue() +{ + HeapWord* start = (HeapWord*)rs.base(); + size_t reserved_byte_size = rs.size(); + assert((uintptr_t(start) & 3) == 0, "bad alignment"); + assert((reserved_byte_size & 3) == 0, "bad alignment"); + MemRegion reserved_mr(start, heap_word_size(reserved_byte_size)); + _bts = new BlockOffsetSharedArray(reserved_mr, + heap_word_size(initial_byte_size)); + MemRegion committed_mr(start, heap_word_size(initial_byte_size)); + _rs->resize_covered_region(committed_mr); + if (_bts == NULL) { + vm_exit_during_initialization("Could not allocate a BlockOffsetArray"); + } + + // Verify that the start and end of this generation is the start of a card. + // If this wasn't true, a single card could span more than on generation, + // which would cause problems when we commit/uncommit memory, and when we + // clear and dirty cards. + guarantee(_rs->is_aligned(reserved_mr.start()), "generation must be card aligned"); + if (reserved_mr.end() != Universe::heap()->reserved_region().end()) { + // Don't check at the very end of the heap as we'll assert that we're probing off + // the end if we try. + guarantee(_rs->is_aligned(reserved_mr.end()), "generation must be card aligned"); + } + _min_heap_delta_bytes = MinHeapDeltaBytes; + _capacity_at_prologue = initial_byte_size; + _used_at_prologue = 0; +} + +bool CardGeneration::grow_by(size_t bytes) { + assert_correct_size_change_locking(); + bool result = _virtual_space.expand_by(bytes); + if (result) { + size_t new_word_size = + heap_word_size(_virtual_space.committed_size()); + MemRegion mr(space()->bottom(), new_word_size); + // Expand card table + Universe::heap()->barrier_set()->resize_covered_region(mr); + // Expand shared block offset array + _bts->resize(new_word_size); + + // Fix for bug #4668531 + if (ZapUnusedHeapArea) { + MemRegion mangle_region(space()->end(), + (HeapWord*)_virtual_space.high()); + SpaceMangler::mangle_region(mangle_region); + } + + // Expand space -- also expands space's BOT + // (which uses (part of) shared array above) + space()->set_end((HeapWord*)_virtual_space.high()); + + // update the space and generation capacity counters + update_counters(); + + if (Verbose && PrintGC) { + size_t new_mem_size = _virtual_space.committed_size(); + size_t old_mem_size = new_mem_size - bytes; + gclog_or_tty->print_cr("Expanding %s from " SIZE_FORMAT "K by " + SIZE_FORMAT "K to " SIZE_FORMAT "K", + name(), old_mem_size/K, bytes/K, new_mem_size/K); + } + } + return result; +} + +bool CardGeneration::expand(size_t bytes, size_t expand_bytes) { + assert_locked_or_safepoint(Heap_lock); + if (bytes == 0) { + return true; // That's what grow_by(0) would return + } + size_t aligned_bytes = ReservedSpace::page_align_size_up(bytes); + if (aligned_bytes == 0){ + // The alignment caused the number of bytes to wrap. An expand_by(0) will + // return true with the implication that an expansion was done when it + // was not. A call to expand implies a best effort to expand by "bytes" + // but not a guarantee. Align down to give a best effort. This is likely + // the most that the generation can expand since it has some capacity to + // start with. + aligned_bytes = ReservedSpace::page_align_size_down(bytes); + } + size_t aligned_expand_bytes = ReservedSpace::page_align_size_up(expand_bytes); + bool success = false; + if (aligned_expand_bytes > aligned_bytes) { + success = grow_by(aligned_expand_bytes); + } + if (!success) { + success = grow_by(aligned_bytes); + } + if (!success) { + success = grow_to_reserved(); + } + if (PrintGC && Verbose) { + if (success && GC_locker::is_active_and_needs_gc()) { + gclog_or_tty->print_cr("Garbage collection disabled, expanded heap instead"); + } + } + + return success; +} + +bool CardGeneration::grow_to_reserved() { + assert_correct_size_change_locking(); + bool success = true; + const size_t remaining_bytes = _virtual_space.uncommitted_size(); + if (remaining_bytes > 0) { + success = grow_by(remaining_bytes); + DEBUG_ONLY(if (!success) warning("grow to reserved failed");) + } + return success; +} + +void CardGeneration::shrink(size_t bytes) { + assert_correct_size_change_locking(); + + size_t size = ReservedSpace::page_align_size_down(bytes); + if (size == 0) { + return; + } + + // Shrink committed space + _virtual_space.shrink_by(size); + // Shrink space; this also shrinks the space's BOT + space()->set_end((HeapWord*) _virtual_space.high()); + size_t new_word_size = heap_word_size(space()->capacity()); + // Shrink the shared block offset array + _bts->resize(new_word_size); + MemRegion mr(space()->bottom(), new_word_size); + // Shrink the card table + Universe::heap()->barrier_set()->resize_covered_region(mr); + + if (Verbose && PrintGC) { + size_t new_mem_size = _virtual_space.committed_size(); + size_t old_mem_size = new_mem_size + size; + gclog_or_tty->print_cr("Shrinking %s from " SIZE_FORMAT "K to " SIZE_FORMAT "K", + name(), old_mem_size/K, new_mem_size/K); + } +} + +// No young generation references, clear this generation's cards. +void CardGeneration::clear_remembered_set() { + _rs->clear(reserved()); +} + +// Objects in this generation may have moved, invalidate this +// generation's cards. +void CardGeneration::invalidate_remembered_set() { + _rs->invalidate(used_region()); +} + +void CardGeneration::compute_new_size() { + assert(_shrink_factor <= 100, "invalid shrink factor"); + size_t current_shrink_factor = _shrink_factor; + _shrink_factor = 0; + + // We don't have floating point command-line arguments + // Note: argument processing ensures that MinHeapFreeRatio < 100. + const double minimum_free_percentage = MinHeapFreeRatio / 100.0; + const double maximum_used_percentage = 1.0 - minimum_free_percentage; + + // Compute some numbers about the state of the heap. + const size_t used_after_gc = used(); + const size_t capacity_after_gc = capacity(); + + const double min_tmp = used_after_gc / maximum_used_percentage; + size_t minimum_desired_capacity = (size_t)MIN2(min_tmp, double(max_uintx)); + // Don't shrink less than the initial generation size + minimum_desired_capacity = MAX2(minimum_desired_capacity, + spec()->init_size()); + assert(used_after_gc <= minimum_desired_capacity, "sanity check"); + + if (PrintGC && Verbose) { + const size_t free_after_gc = free(); + const double free_percentage = ((double)free_after_gc) / capacity_after_gc; + gclog_or_tty->print_cr("TenuredGeneration::compute_new_size: "); + gclog_or_tty->print_cr(" " + " minimum_free_percentage: %6.2f" + " maximum_used_percentage: %6.2f", + minimum_free_percentage, + maximum_used_percentage); + gclog_or_tty->print_cr(" " + " free_after_gc : %6.1fK" + " used_after_gc : %6.1fK" + " capacity_after_gc : %6.1fK", + free_after_gc / (double) K, + used_after_gc / (double) K, + capacity_after_gc / (double) K); + gclog_or_tty->print_cr(" " + " free_percentage: %6.2f", + free_percentage); + } + + if (capacity_after_gc < minimum_desired_capacity) { + // If we have less free space than we want then expand + size_t expand_bytes = minimum_desired_capacity - capacity_after_gc; + // Don't expand unless it's significant + if (expand_bytes >= _min_heap_delta_bytes) { + expand(expand_bytes, 0); // safe if expansion fails + } + if (PrintGC && Verbose) { + gclog_or_tty->print_cr(" expanding:" + " minimum_desired_capacity: %6.1fK" + " expand_bytes: %6.1fK" + " _min_heap_delta_bytes: %6.1fK", + minimum_desired_capacity / (double) K, + expand_bytes / (double) K, + _min_heap_delta_bytes / (double) K); + } + return; + } + + // No expansion, now see if we want to shrink + size_t shrink_bytes = 0; + // We would never want to shrink more than this + size_t max_shrink_bytes = capacity_after_gc - minimum_desired_capacity; + + if (MaxHeapFreeRatio < 100) { + const double maximum_free_percentage = MaxHeapFreeRatio / 100.0; + const double minimum_used_percentage = 1.0 - maximum_free_percentage; + const double max_tmp = used_after_gc / minimum_used_percentage; + size_t maximum_desired_capacity = (size_t)MIN2(max_tmp, double(max_uintx)); + maximum_desired_capacity = MAX2(maximum_desired_capacity, + spec()->init_size()); + if (PrintGC && Verbose) { + gclog_or_tty->print_cr(" " + " maximum_free_percentage: %6.2f" + " minimum_used_percentage: %6.2f", + maximum_free_percentage, + minimum_used_percentage); + gclog_or_tty->print_cr(" " + " _capacity_at_prologue: %6.1fK" + " minimum_desired_capacity: %6.1fK" + " maximum_desired_capacity: %6.1fK", + _capacity_at_prologue / (double) K, + minimum_desired_capacity / (double) K, + maximum_desired_capacity / (double) K); + } + assert(minimum_desired_capacity <= maximum_desired_capacity, + "sanity check"); + + if (capacity_after_gc > maximum_desired_capacity) { + // Capacity too large, compute shrinking size + shrink_bytes = capacity_after_gc - maximum_desired_capacity; + // We don't want shrink all the way back to initSize if people call + // System.gc(), because some programs do that between "phases" and then + // we'd just have to grow the heap up again for the next phase. So we + // damp the shrinking: 0% on the first call, 10% on the second call, 40% + // on the third call, and 100% by the fourth call. But if we recompute + // size without shrinking, it goes back to 0%. + shrink_bytes = shrink_bytes / 100 * current_shrink_factor; + assert(shrink_bytes <= max_shrink_bytes, "invalid shrink size"); + if (current_shrink_factor == 0) { + _shrink_factor = 10; + } else { + _shrink_factor = MIN2(current_shrink_factor * 4, (size_t) 100); + } + if (PrintGC && Verbose) { + gclog_or_tty->print_cr(" " + " shrinking:" + " initSize: %.1fK" + " maximum_desired_capacity: %.1fK", + spec()->init_size() / (double) K, + maximum_desired_capacity / (double) K); + gclog_or_tty->print_cr(" " + " shrink_bytes: %.1fK" + " current_shrink_factor: " SIZE_FORMAT + " new shrink factor: " SIZE_FORMAT + " _min_heap_delta_bytes: %.1fK", + shrink_bytes / (double) K, + current_shrink_factor, + _shrink_factor, + _min_heap_delta_bytes / (double) K); + } + } + } + + if (capacity_after_gc > _capacity_at_prologue) { + // We might have expanded for promotions, in which case we might want to + // take back that expansion if there's room after GC. That keeps us from + // stretching the heap with promotions when there's plenty of room. + size_t expansion_for_promotion = capacity_after_gc - _capacity_at_prologue; + expansion_for_promotion = MIN2(expansion_for_promotion, max_shrink_bytes); + // We have two shrinking computations, take the largest + shrink_bytes = MAX2(shrink_bytes, expansion_for_promotion); + assert(shrink_bytes <= max_shrink_bytes, "invalid shrink size"); + if (PrintGC && Verbose) { + gclog_or_tty->print_cr(" " + " aggressive shrinking:" + " _capacity_at_prologue: %.1fK" + " capacity_after_gc: %.1fK" + " expansion_for_promotion: %.1fK" + " shrink_bytes: %.1fK", + capacity_after_gc / (double) K, + _capacity_at_prologue / (double) K, + expansion_for_promotion / (double) K, + shrink_bytes / (double) K); + } + } + // Don't shrink unless it's significant + if (shrink_bytes >= _min_heap_delta_bytes) { + shrink(shrink_bytes); + } +} + +// Currently nothing to do. +void CardGeneration::prepare_for_verify() {} + +void CardGeneration::space_iterate(SpaceClosure* blk, + bool usedOnly) { + blk->do_space(space()); +} + +void CardGeneration::younger_refs_iterate(OopsInGenClosure* blk) { + blk->set_generation(this); + younger_refs_in_space_iterate(space(), blk); + blk->reset_generation(); +} diff --git a/hotspot/src/share/vm/memory/cardGeneration.hpp b/hotspot/src/share/vm/memory/cardGeneration.hpp new file mode 100644 index 00000000000..24d0fa0f2c2 --- /dev/null +++ b/hotspot/src/share/vm/memory/cardGeneration.hpp @@ -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. + * + */ + +#ifndef SHARE_VM_MEMORY_CARDGENERATION_HPP +#define SHARE_VM_MEMORY_CARDGENERATION_HPP + +// Class CardGeneration is a generation that is covered by a card table, +// and uses a card-size block-offset array to implement block_start. + +#include "memory/generation.hpp" + +class BlockOffsetSharedArray; +class CompactibleSpace; + +class CardGeneration: public Generation { + friend class VMStructs; + protected: + // This is shared with other generations. + GenRemSet* _rs; + // This is local to this generation. + BlockOffsetSharedArray* _bts; + + // Current shrinking effect: this damps shrinking when the heap gets empty. + size_t _shrink_factor; + + size_t _min_heap_delta_bytes; // Minimum amount to expand. + + // Some statistics from before gc started. + // These are gathered in the gc_prologue (and should_collect) + // to control growing/shrinking policy in spite of promotions. + size_t _capacity_at_prologue; + size_t _used_at_prologue; + + CardGeneration(ReservedSpace rs, size_t initial_byte_size, int level, + GenRemSet* remset); + + virtual void assert_correct_size_change_locking() = 0; + + virtual CompactibleSpace* space() const = 0; + + public: + + // Attempt to expand the generation by "bytes". Expand by at a + // minimum "expand_bytes". Return true if some amount (not + // necessarily the full "bytes") was done. + virtual bool expand(size_t bytes, size_t expand_bytes); + + // Shrink generation with specified size + virtual void shrink(size_t bytes); + + virtual void compute_new_size(); + + virtual void clear_remembered_set(); + + virtual void invalidate_remembered_set(); + + virtual void prepare_for_verify(); + + // Grow generation with specified size (returns false if unable to grow) + bool grow_by(size_t bytes); + // Grow generation to reserved size. + bool grow_to_reserved(); + + size_t capacity() const; + size_t used() const; + size_t free() const; + MemRegion used_region() const; + + void space_iterate(SpaceClosure* blk, bool usedOnly = false); + + void younger_refs_iterate(OopsInGenClosure* blk); + + bool is_in(const void* p) const; + + CompactibleSpace* first_compaction_space() const; +}; + +#endif // SHARE_VM_MEMORY_CARDGENERATION_HPP diff --git a/hotspot/src/share/vm/memory/cardGeneration.inline.hpp b/hotspot/src/share/vm/memory/cardGeneration.inline.hpp new file mode 100644 index 00000000000..fb49d0d0718 --- /dev/null +++ b/hotspot/src/share/vm/memory/cardGeneration.inline.hpp @@ -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_CARDGENERATION_INLINE_HPP +#define SHARE_VM_MEMORY_CARDGENERATION_INLINE_HPP + +#include "memory/cardGeneration.hpp" +#include "memory/space.hpp" + +inline size_t CardGeneration::capacity() const { + return space()->capacity(); +} + +inline size_t CardGeneration::used() const { + return space()->used(); +} + +inline size_t CardGeneration::free() const { + return space()->free(); +} + +inline MemRegion CardGeneration::used_region() const { + return space()->used_region(); +} + +inline bool CardGeneration::is_in(const void* p) const { + return space()->is_in(p); +} + +inline CompactibleSpace* CardGeneration::first_compaction_space() const { + return space(); +} + +#endif // SHARE_VM_MEMORY_CARDGENERATION_INLINE_HPP diff --git a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp index d9460308ac7..d3586332b2f 100644 --- a/hotspot/src/share/vm/memory/cardTableModRefBS.cpp +++ b/hotspot/src/share/vm/memory/cardTableModRefBS.cpp @@ -275,29 +275,26 @@ void CardTableModRefBS::resize_covered_region(MemRegion new_region) { // the new_end_aligned does not intrude onto the committed // space of another region. int ri = 0; - for (ri = 0; ri < _cur_covered_regions; ri++) { - if (ri != ind) { - if (_committed[ri].contains(new_end_aligned)) { - // The prior check included in the assert - // (new_end_aligned >= _committed[ri].start()) - // is redundant with the "contains" test. - // Any region containing the new end - // should start at or beyond the region found (ind) - // for the new end (committed regions are not expected to - // be proper subsets of other committed regions). - assert(_committed[ri].start() >= _committed[ind].start(), - "New end of committed region is inconsistent"); - new_end_aligned = _committed[ri].start(); - // new_end_aligned can be equal to the start of its - // committed region (i.e., of "ind") if a second - // region following "ind" also start at the same location - // as "ind". - assert(new_end_aligned >= _committed[ind].start(), - "New end of committed region is before start"); - debug_only(collided = true;) - // Should only collide with 1 region - break; - } + for (ri = ind + 1; ri < _cur_covered_regions; ri++) { + if (new_end_aligned > _committed[ri].start()) { + assert(new_end_aligned <= _committed[ri].end(), + "An earlier committed region can't cover a later committed region"); + // Any region containing the new end + // should start at or beyond the region found (ind) + // for the new end (committed regions are not expected to + // be proper subsets of other committed regions). + assert(_committed[ri].start() >= _committed[ind].start(), + "New end of committed region is inconsistent"); + new_end_aligned = _committed[ri].start(); + // new_end_aligned can be equal to the start of its + // committed region (i.e., of "ind") if a second + // region following "ind" also start at the same location + // as "ind". + assert(new_end_aligned >= _committed[ind].start(), + "New end of committed region is before start"); + debug_only(collided = true;) + // Should only collide with 1 region + break; } } #ifdef ASSERT diff --git a/hotspot/src/share/vm/memory/generation.cpp b/hotspot/src/share/vm/memory/generation.cpp index 87880cf0e31..617ed682cfc 100644 --- a/hotspot/src/share/vm/memory/generation.cpp +++ b/hotspot/src/share/vm/memory/generation.cpp @@ -361,244 +361,3 @@ void Generation::compact() { sp = sp->next_compaction_space(); } } - -CardGeneration::CardGeneration(ReservedSpace rs, size_t initial_byte_size, - int level, - GenRemSet* remset) : - Generation(rs, initial_byte_size, level), _rs(remset), - _shrink_factor(0), _min_heap_delta_bytes(), _capacity_at_prologue(), - _used_at_prologue() -{ - HeapWord* start = (HeapWord*)rs.base(); - size_t reserved_byte_size = rs.size(); - assert((uintptr_t(start) & 3) == 0, "bad alignment"); - assert((reserved_byte_size & 3) == 0, "bad alignment"); - MemRegion reserved_mr(start, heap_word_size(reserved_byte_size)); - _bts = new BlockOffsetSharedArray(reserved_mr, - heap_word_size(initial_byte_size)); - MemRegion committed_mr(start, heap_word_size(initial_byte_size)); - _rs->resize_covered_region(committed_mr); - if (_bts == NULL) - vm_exit_during_initialization("Could not allocate a BlockOffsetArray"); - - // Verify that the start and end of this generation is the start of a card. - // If this wasn't true, a single card could span more than on generation, - // which would cause problems when we commit/uncommit memory, and when we - // clear and dirty cards. - guarantee(_rs->is_aligned(reserved_mr.start()), "generation must be card aligned"); - if (reserved_mr.end() != Universe::heap()->reserved_region().end()) { - // Don't check at the very end of the heap as we'll assert that we're probing off - // the end if we try. - guarantee(_rs->is_aligned(reserved_mr.end()), "generation must be card aligned"); - } - _min_heap_delta_bytes = MinHeapDeltaBytes; - _capacity_at_prologue = initial_byte_size; - _used_at_prologue = 0; -} - -bool CardGeneration::expand(size_t bytes, size_t expand_bytes) { - assert_locked_or_safepoint(Heap_lock); - if (bytes == 0) { - return true; // That's what grow_by(0) would return - } - size_t aligned_bytes = ReservedSpace::page_align_size_up(bytes); - if (aligned_bytes == 0){ - // The alignment caused the number of bytes to wrap. An expand_by(0) will - // return true with the implication that an expansion was done when it - // was not. A call to expand implies a best effort to expand by "bytes" - // but not a guarantee. Align down to give a best effort. This is likely - // the most that the generation can expand since it has some capacity to - // start with. - aligned_bytes = ReservedSpace::page_align_size_down(bytes); - } - size_t aligned_expand_bytes = ReservedSpace::page_align_size_up(expand_bytes); - bool success = false; - if (aligned_expand_bytes > aligned_bytes) { - success = grow_by(aligned_expand_bytes); - } - if (!success) { - success = grow_by(aligned_bytes); - } - if (!success) { - success = grow_to_reserved(); - } - if (PrintGC && Verbose) { - if (success && GC_locker::is_active_and_needs_gc()) { - gclog_or_tty->print_cr("Garbage collection disabled, expanded heap instead"); - } - } - - return success; -} - - -// No young generation references, clear this generation's cards. -void CardGeneration::clear_remembered_set() { - _rs->clear(reserved()); -} - - -// Objects in this generation may have moved, invalidate this -// generation's cards. -void CardGeneration::invalidate_remembered_set() { - _rs->invalidate(used_region()); -} - - -void CardGeneration::compute_new_size() { - assert(_shrink_factor <= 100, "invalid shrink factor"); - size_t current_shrink_factor = _shrink_factor; - _shrink_factor = 0; - - // We don't have floating point command-line arguments - // Note: argument processing ensures that MinHeapFreeRatio < 100. - const double minimum_free_percentage = MinHeapFreeRatio / 100.0; - const double maximum_used_percentage = 1.0 - minimum_free_percentage; - - // Compute some numbers about the state of the heap. - const size_t used_after_gc = used(); - const size_t capacity_after_gc = capacity(); - - const double min_tmp = used_after_gc / maximum_used_percentage; - size_t minimum_desired_capacity = (size_t)MIN2(min_tmp, double(max_uintx)); - // Don't shrink less than the initial generation size - minimum_desired_capacity = MAX2(minimum_desired_capacity, - spec()->init_size()); - assert(used_after_gc <= minimum_desired_capacity, "sanity check"); - - if (PrintGC && Verbose) { - const size_t free_after_gc = free(); - const double free_percentage = ((double)free_after_gc) / capacity_after_gc; - gclog_or_tty->print_cr("TenuredGeneration::compute_new_size: "); - gclog_or_tty->print_cr(" " - " minimum_free_percentage: %6.2f" - " maximum_used_percentage: %6.2f", - minimum_free_percentage, - maximum_used_percentage); - gclog_or_tty->print_cr(" " - " free_after_gc : %6.1fK" - " used_after_gc : %6.1fK" - " capacity_after_gc : %6.1fK", - free_after_gc / (double) K, - used_after_gc / (double) K, - capacity_after_gc / (double) K); - gclog_or_tty->print_cr(" " - " free_percentage: %6.2f", - free_percentage); - } - - if (capacity_after_gc < minimum_desired_capacity) { - // If we have less free space than we want then expand - size_t expand_bytes = minimum_desired_capacity - capacity_after_gc; - // Don't expand unless it's significant - if (expand_bytes >= _min_heap_delta_bytes) { - expand(expand_bytes, 0); // safe if expansion fails - } - if (PrintGC && Verbose) { - gclog_or_tty->print_cr(" expanding:" - " minimum_desired_capacity: %6.1fK" - " expand_bytes: %6.1fK" - " _min_heap_delta_bytes: %6.1fK", - minimum_desired_capacity / (double) K, - expand_bytes / (double) K, - _min_heap_delta_bytes / (double) K); - } - return; - } - - // No expansion, now see if we want to shrink - size_t shrink_bytes = 0; - // We would never want to shrink more than this - size_t max_shrink_bytes = capacity_after_gc - minimum_desired_capacity; - - if (MaxHeapFreeRatio < 100) { - const double maximum_free_percentage = MaxHeapFreeRatio / 100.0; - const double minimum_used_percentage = 1.0 - maximum_free_percentage; - const double max_tmp = used_after_gc / minimum_used_percentage; - size_t maximum_desired_capacity = (size_t)MIN2(max_tmp, double(max_uintx)); - maximum_desired_capacity = MAX2(maximum_desired_capacity, - spec()->init_size()); - if (PrintGC && Verbose) { - gclog_or_tty->print_cr(" " - " maximum_free_percentage: %6.2f" - " minimum_used_percentage: %6.2f", - maximum_free_percentage, - minimum_used_percentage); - gclog_or_tty->print_cr(" " - " _capacity_at_prologue: %6.1fK" - " minimum_desired_capacity: %6.1fK" - " maximum_desired_capacity: %6.1fK", - _capacity_at_prologue / (double) K, - minimum_desired_capacity / (double) K, - maximum_desired_capacity / (double) K); - } - assert(minimum_desired_capacity <= maximum_desired_capacity, - "sanity check"); - - if (capacity_after_gc > maximum_desired_capacity) { - // Capacity too large, compute shrinking size - shrink_bytes = capacity_after_gc - maximum_desired_capacity; - // We don't want shrink all the way back to initSize if people call - // System.gc(), because some programs do that between "phases" and then - // we'd just have to grow the heap up again for the next phase. So we - // damp the shrinking: 0% on the first call, 10% on the second call, 40% - // on the third call, and 100% by the fourth call. But if we recompute - // size without shrinking, it goes back to 0%. - shrink_bytes = shrink_bytes / 100 * current_shrink_factor; - assert(shrink_bytes <= max_shrink_bytes, "invalid shrink size"); - if (current_shrink_factor == 0) { - _shrink_factor = 10; - } else { - _shrink_factor = MIN2(current_shrink_factor * 4, (size_t) 100); - } - if (PrintGC && Verbose) { - gclog_or_tty->print_cr(" " - " shrinking:" - " initSize: %.1fK" - " maximum_desired_capacity: %.1fK", - spec()->init_size() / (double) K, - maximum_desired_capacity / (double) K); - gclog_or_tty->print_cr(" " - " shrink_bytes: %.1fK" - " current_shrink_factor: " SIZE_FORMAT - " new shrink factor: " SIZE_FORMAT - " _min_heap_delta_bytes: %.1fK", - shrink_bytes / (double) K, - current_shrink_factor, - _shrink_factor, - _min_heap_delta_bytes / (double) K); - } - } - } - - if (capacity_after_gc > _capacity_at_prologue) { - // We might have expanded for promotions, in which case we might want to - // take back that expansion if there's room after GC. That keeps us from - // stretching the heap with promotions when there's plenty of room. - size_t expansion_for_promotion = capacity_after_gc - _capacity_at_prologue; - expansion_for_promotion = MIN2(expansion_for_promotion, max_shrink_bytes); - // We have two shrinking computations, take the largest - shrink_bytes = MAX2(shrink_bytes, expansion_for_promotion); - assert(shrink_bytes <= max_shrink_bytes, "invalid shrink size"); - if (PrintGC && Verbose) { - gclog_or_tty->print_cr(" " - " aggressive shrinking:" - " _capacity_at_prologue: %.1fK" - " capacity_after_gc: %.1fK" - " expansion_for_promotion: %.1fK" - " shrink_bytes: %.1fK", - capacity_after_gc / (double) K, - _capacity_at_prologue / (double) K, - expansion_for_promotion / (double) K, - shrink_bytes / (double) K); - } - } - // Don't shrink unless it's significant - if (shrink_bytes >= _min_heap_delta_bytes) { - shrink(shrink_bytes); - } -} - -// Currently nothing to do. -void CardGeneration::prepare_for_verify() {} - diff --git a/hotspot/src/share/vm/memory/generation.hpp b/hotspot/src/share/vm/memory/generation.hpp index e9c352e10b4..058f757de01 100644 --- a/hotspot/src/share/vm/memory/generation.hpp +++ b/hotspot/src/share/vm/memory/generation.hpp @@ -584,57 +584,4 @@ public: virtual CollectorCounters* counters() { return _gc_counters; } }; -// Class CardGeneration is a generation that is covered by a card table, -// and uses a card-size block-offset array to implement block_start. - -// class BlockOffsetArray; -// class BlockOffsetArrayContigSpace; -class BlockOffsetSharedArray; - -class CardGeneration: public Generation { - friend class VMStructs; - protected: - // This is shared with other generations. - GenRemSet* _rs; - // This is local to this generation. - BlockOffsetSharedArray* _bts; - - // current shrinking effect: this damps shrinking when the heap gets empty. - size_t _shrink_factor; - - size_t _min_heap_delta_bytes; // Minimum amount to expand. - - // Some statistics from before gc started. - // These are gathered in the gc_prologue (and should_collect) - // to control growing/shrinking policy in spite of promotions. - size_t _capacity_at_prologue; - size_t _used_at_prologue; - - CardGeneration(ReservedSpace rs, size_t initial_byte_size, int level, - GenRemSet* remset); - - public: - - // Attempt to expand the generation by "bytes". Expand by at a - // minimum "expand_bytes". Return true if some amount (not - // necessarily the full "bytes") was done. - virtual bool expand(size_t bytes, size_t expand_bytes); - - // Shrink generation with specified size (returns false if unable to shrink) - virtual void shrink(size_t bytes) = 0; - - virtual void compute_new_size(); - - virtual void clear_remembered_set(); - - virtual void invalidate_remembered_set(); - - virtual void prepare_for_verify(); - - // Grow generation with specified size (returns false if unable to grow) - virtual bool grow_by(size_t bytes) = 0; - // Grow generation to reserved size. - virtual bool grow_to_reserved() = 0; -}; - #endif // SHARE_VM_MEMORY_GENERATION_HPP diff --git a/hotspot/src/share/vm/memory/tenuredGeneration.cpp b/hotspot/src/share/vm/memory/tenuredGeneration.cpp index 37cd32c8585..aa1c51237ed 100644 --- a/hotspot/src/share/vm/memory/tenuredGeneration.cpp +++ b/hotspot/src/share/vm/memory/tenuredGeneration.cpp @@ -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 @@ -235,34 +235,6 @@ bool TenuredGeneration::expand(size_t bytes, size_t expand_bytes) { return CardGeneration::expand(bytes, expand_bytes); } - -void TenuredGeneration::shrink(size_t bytes) { - assert_locked_or_safepoint(ExpandHeap_lock); - size_t size = ReservedSpace::page_align_size_down(bytes); - if (size > 0) { - shrink_by(size); - } -} - - -size_t TenuredGeneration::capacity() const { - return _the_space->capacity(); -} - - -size_t TenuredGeneration::used() const { - return _the_space->used(); -} - - -size_t TenuredGeneration::free() const { - return _the_space->free(); -} - -MemRegion TenuredGeneration::used_region() const { - return the_space()->used_region(); -} - size_t TenuredGeneration::unsafe_max_alloc_nogc() const { return _the_space->free(); } @@ -271,74 +243,8 @@ size_t TenuredGeneration::contiguous_available() const { return _the_space->free() + _virtual_space.uncommitted_size(); } -bool TenuredGeneration::grow_by(size_t bytes) { +void TenuredGeneration::assert_correct_size_change_locking() { assert_locked_or_safepoint(ExpandHeap_lock); - bool result = _virtual_space.expand_by(bytes); - if (result) { - size_t new_word_size = - heap_word_size(_virtual_space.committed_size()); - MemRegion mr(_the_space->bottom(), new_word_size); - // Expand card table - Universe::heap()->barrier_set()->resize_covered_region(mr); - // Expand shared block offset array - _bts->resize(new_word_size); - - // Fix for bug #4668531 - if (ZapUnusedHeapArea) { - MemRegion mangle_region(_the_space->end(), - (HeapWord*)_virtual_space.high()); - SpaceMangler::mangle_region(mangle_region); - } - - // Expand space -- also expands space's BOT - // (which uses (part of) shared array above) - _the_space->set_end((HeapWord*)_virtual_space.high()); - - // update the space and generation capacity counters - update_counters(); - - if (Verbose && PrintGC) { - size_t new_mem_size = _virtual_space.committed_size(); - size_t old_mem_size = new_mem_size - bytes; - gclog_or_tty->print_cr("Expanding %s from " SIZE_FORMAT "K by " - SIZE_FORMAT "K to " SIZE_FORMAT "K", - name(), old_mem_size/K, bytes/K, new_mem_size/K); - } - } - return result; -} - - -bool TenuredGeneration::grow_to_reserved() { - assert_locked_or_safepoint(ExpandHeap_lock); - bool success = true; - const size_t remaining_bytes = _virtual_space.uncommitted_size(); - if (remaining_bytes > 0) { - success = grow_by(remaining_bytes); - DEBUG_ONLY(if (!success) warning("grow to reserved failed");) - } - return success; -} - -void TenuredGeneration::shrink_by(size_t bytes) { - assert_locked_or_safepoint(ExpandHeap_lock); - // Shrink committed space - _virtual_space.shrink_by(bytes); - // Shrink space; this also shrinks the space's BOT - _the_space->set_end((HeapWord*) _virtual_space.high()); - size_t new_word_size = heap_word_size(_the_space->capacity()); - // Shrink the shared block offset array - _bts->resize(new_word_size); - MemRegion mr(_the_space->bottom(), new_word_size); - // Shrink the card table - Universe::heap()->barrier_set()->resize_covered_region(mr); - - if (Verbose && PrintGC) { - size_t new_mem_size = _virtual_space.committed_size(); - size_t old_mem_size = new_mem_size + bytes; - gclog_or_tty->print_cr("Shrinking %s from " SIZE_FORMAT "K to " SIZE_FORMAT "K", - name(), old_mem_size/K, new_mem_size/K); - } } // Currently nothing to do. @@ -348,27 +254,14 @@ void TenuredGeneration::object_iterate(ObjectClosure* blk) { _the_space->object_iterate(blk); } -void TenuredGeneration::space_iterate(SpaceClosure* blk, - bool usedOnly) { - blk->do_space(_the_space); -} - -void TenuredGeneration::younger_refs_iterate(OopsInGenClosure* blk) { - blk->set_generation(this); - younger_refs_in_space_iterate(_the_space, blk); - blk->reset_generation(); -} - void TenuredGeneration::save_marks() { _the_space->set_saved_mark(); } - void TenuredGeneration::reset_saved_marks() { _the_space->reset_saved_mark(); } - bool TenuredGeneration::no_allocs_since_save_marks() { return _the_space->saved_mark_at_top(); } @@ -387,28 +280,25 @@ ALL_SINCE_SAVE_MARKS_CLOSURES(TenuredGen_SINCE_SAVE_MARKS_ITERATE_DEFN) #undef TenuredGen_SINCE_SAVE_MARKS_ITERATE_DEFN - void TenuredGeneration::gc_epilogue(bool full) { - _last_gc = WaterMark(the_space(), the_space()->top()); - // update the generation and space performance counters update_counters(); if (ZapUnusedHeapArea) { - the_space()->check_mangled_unused_area_complete(); + _the_space->check_mangled_unused_area_complete(); } } void TenuredGeneration::record_spaces_top() { assert(ZapUnusedHeapArea, "Not mangling unused space"); - the_space()->set_top_for_allocations(); + _the_space->set_top_for_allocations(); } void TenuredGeneration::verify() { - the_space()->verify(); + _the_space->verify(); } void TenuredGeneration::print_on(outputStream* st) const { Generation::print_on(st); st->print(" the"); - the_space()->print_on(st); + _the_space->print_on(st); } diff --git a/hotspot/src/share/vm/memory/tenuredGeneration.hpp b/hotspot/src/share/vm/memory/tenuredGeneration.hpp index 0ecd54dd55f..5417e69cb7f 100644 --- a/hotspot/src/share/vm/memory/tenuredGeneration.hpp +++ b/hotspot/src/share/vm/memory/tenuredGeneration.hpp @@ -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,7 +28,7 @@ #include "gc_implementation/shared/cSpaceCounters.hpp" #include "gc_implementation/shared/gcStats.hpp" #include "gc_implementation/shared/generationCounters.hpp" -#include "memory/generation.hpp" +#include "memory/cardGeneration.hpp" #include "utilities/macros.hpp" // TenuredGeneration models the heap containing old (promoted/tenured) objects @@ -42,27 +42,18 @@ class TenuredGeneration: public CardGeneration { friend class VM_PopulateDumpSharedSpace; protected: - ContiguousSpace* _the_space; // actual space holding objects - WaterMark _last_gc; // watermark between objects allocated before - // and after last GC. + ContiguousSpace* _the_space; // Actual space holding objects GenerationCounters* _gen_counters; CSpaceCounters* _space_counters; - // Grow generation with specified size (returns false if unable to grow) - virtual bool grow_by(size_t bytes); - // Grow generation to reserved size. - virtual bool grow_to_reserved(); - // Shrink generation with specified size (returns false if unable to shrink) - void shrink_by(size_t bytes); - // Allocation failure virtual bool expand(size_t bytes, size_t expand_bytes); - void shrink(size_t bytes); // Accessing spaces - ContiguousSpace* the_space() const { return _the_space; } + ContiguousSpace* space() const { return _the_space; } + void assert_correct_size_change_locking(); public: TenuredGeneration(ReservedSpace rs, size_t initial_byte_size, int level, GenRemSet* remset); @@ -81,33 +72,15 @@ class TenuredGeneration: public CardGeneration { return !ScavengeBeforeFullGC; } - inline bool is_in(const void* p) const; - - // Space enquiries - size_t capacity() const; - size_t used() const; - size_t free() const; - - MemRegion used_region() const; - size_t unsafe_max_alloc_nogc() const; size_t contiguous_available() const; // Iteration void object_iterate(ObjectClosure* blk); - void space_iterate(SpaceClosure* blk, bool usedOnly = false); - - void younger_refs_iterate(OopsInGenClosure* blk); - - inline CompactibleSpace* first_compaction_space() const; virtual inline HeapWord* allocate(size_t word_size, bool is_tlab); virtual inline HeapWord* par_allocate(size_t word_size, bool is_tlab); - // Accessing marks - inline WaterMark top_mark(); - inline WaterMark bottom_mark(); - #define TenuredGen_SINCE_SAVE_MARKS_DECL(OopClosureType, nv_suffix) \ void oop_since_save_marks_iterate##nv_suffix(OopClosureType* cl); TenuredGen_SINCE_SAVE_MARKS_DECL(OopsInGenClosure,_v) diff --git a/hotspot/src/share/vm/memory/tenuredGeneration.inline.hpp b/hotspot/src/share/vm/memory/tenuredGeneration.inline.hpp index 0aa4c6d2d3b..aea97ea317a 100644 --- a/hotspot/src/share/vm/memory/tenuredGeneration.inline.hpp +++ b/hotspot/src/share/vm/memory/tenuredGeneration.inline.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, 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 @@ -22,53 +22,35 @@ * */ -#ifndef SHARE_VM_MEMORY_GENERATION_INLINE_HPP -#define SHARE_VM_MEMORY_GENERATION_INLINE_HPP +#ifndef SHARE_VM_MEMORY_TENUREDGENERATION_INLINE_HPP +#define SHARE_VM_MEMORY_TENUREDGENERATION_INLINE_HPP -#include "memory/genCollectedHeap.hpp" #include "memory/space.hpp" #include "memory/tenuredGeneration.hpp" -bool TenuredGeneration::is_in(const void* p) const { - return the_space()->is_in(p); -} - - -WaterMark TenuredGeneration::top_mark() { - return the_space()->top_mark(); -} - -CompactibleSpace* -TenuredGeneration::first_compaction_space() const { - return the_space(); -} - HeapWord* TenuredGeneration::allocate(size_t word_size, bool is_tlab) { assert(!is_tlab, "TenuredGeneration does not support TLAB allocation"); - return the_space()->allocate(word_size); + return _the_space->allocate(word_size); } HeapWord* TenuredGeneration::par_allocate(size_t word_size, bool is_tlab) { assert(!is_tlab, "TenuredGeneration does not support TLAB allocation"); - return the_space()->par_allocate(word_size); -} - -WaterMark TenuredGeneration::bottom_mark() { - return the_space()->bottom_mark(); + return _the_space->par_allocate(word_size); } size_t TenuredGeneration::block_size(const HeapWord* addr) const { - if (addr < the_space()->top()) return oop(addr)->size(); - else { - assert(addr == the_space()->top(), "non-block head arg to block_size"); - return the_space()->end() - the_space()->top(); + if (addr < _the_space->top()) { + return oop(addr)->size(); + } else { + assert(addr == _the_space->top(), "non-block head arg to block_size"); + return _the_space->end() - _the_space->top(); } } bool TenuredGeneration::block_is_obj(const HeapWord* addr) const { - return addr < the_space()->top(); + return addr < _the_space ->top(); } -#endif // SHARE_VM_MEMORY_GENERATION_INLINE_HPP +#endif // SHARE_VM_MEMORY_TENUREDGENERATION_INLINE_HPP diff --git a/hotspot/src/share/vm/memory/universe.cpp b/hotspot/src/share/vm/memory/universe.cpp index c731140cd5f..61396a28c2b 100644 --- a/hotspot/src/share/vm/memory/universe.cpp +++ b/hotspot/src/share/vm/memory/universe.cpp @@ -120,6 +120,7 @@ oop Universe::_out_of_memory_error_metaspace = NULL; oop Universe::_out_of_memory_error_class_metaspace = NULL; oop Universe::_out_of_memory_error_array_size = NULL; oop Universe::_out_of_memory_error_gc_overhead_limit = NULL; +oop Universe::_out_of_memory_error_realloc_objects = NULL; objArrayOop Universe::_preallocated_out_of_memory_error_array = NULL; volatile jint Universe::_preallocated_out_of_memory_error_avail_count = 0; bool Universe::_verify_in_progress = false; @@ -191,6 +192,7 @@ void Universe::oops_do(OopClosure* f, bool do_all) { f->do_oop((oop*)&_out_of_memory_error_class_metaspace); f->do_oop((oop*)&_out_of_memory_error_array_size); f->do_oop((oop*)&_out_of_memory_error_gc_overhead_limit); + f->do_oop((oop*)&_out_of_memory_error_realloc_objects); f->do_oop((oop*)&_preallocated_out_of_memory_error_array); f->do_oop((oop*)&_null_ptr_exception_instance); f->do_oop((oop*)&_arithmetic_exception_instance); @@ -575,7 +577,8 @@ bool Universe::should_fill_in_stack_trace(Handle throwable) { (throwable() != Universe::_out_of_memory_error_metaspace) && (throwable() != Universe::_out_of_memory_error_class_metaspace) && (throwable() != Universe::_out_of_memory_error_array_size) && - (throwable() != Universe::_out_of_memory_error_gc_overhead_limit)); + (throwable() != Universe::_out_of_memory_error_gc_overhead_limit) && + (throwable() != Universe::_out_of_memory_error_realloc_objects)); } @@ -1039,6 +1042,7 @@ bool universe_post_init() { Universe::_out_of_memory_error_array_size = k_h->allocate_instance(CHECK_false); Universe::_out_of_memory_error_gc_overhead_limit = k_h->allocate_instance(CHECK_false); + Universe::_out_of_memory_error_realloc_objects = k_h->allocate_instance(CHECK_false); // Setup preallocated NullPointerException // (this is currently used for a cheap & dirty solution in compiler exception handling) @@ -1078,6 +1082,9 @@ bool universe_post_init() { msg = java_lang_String::create_from_str("GC overhead limit exceeded", CHECK_false); java_lang_Throwable::set_message(Universe::_out_of_memory_error_gc_overhead_limit, msg()); + msg = java_lang_String::create_from_str("Java heap space: failed reallocation of scalar replaced objects", CHECK_false); + java_lang_Throwable::set_message(Universe::_out_of_memory_error_realloc_objects, msg()); + msg = java_lang_String::create_from_str("/ by zero", CHECK_false); java_lang_Throwable::set_message(Universe::_arithmetic_exception_instance, msg()); diff --git a/hotspot/src/share/vm/memory/universe.hpp b/hotspot/src/share/vm/memory/universe.hpp index 40e2d03b6d4..52334d0dbce 100644 --- a/hotspot/src/share/vm/memory/universe.hpp +++ b/hotspot/src/share/vm/memory/universe.hpp @@ -157,6 +157,7 @@ class Universe: AllStatic { static oop _out_of_memory_error_class_metaspace; static oop _out_of_memory_error_array_size; static oop _out_of_memory_error_gc_overhead_limit; + static oop _out_of_memory_error_realloc_objects; static Array* _the_empty_int_array; // Canonicalized int array static Array* _the_empty_short_array; // Canonicalized short array @@ -328,6 +329,7 @@ class Universe: AllStatic { static oop out_of_memory_error_class_metaspace() { return gen_out_of_memory_error(_out_of_memory_error_class_metaspace); } static oop out_of_memory_error_array_size() { return gen_out_of_memory_error(_out_of_memory_error_array_size); } static oop out_of_memory_error_gc_overhead_limit() { return gen_out_of_memory_error(_out_of_memory_error_gc_overhead_limit); } + static oop out_of_memory_error_realloc_objects() { return gen_out_of_memory_error(_out_of_memory_error_realloc_objects); } // Accessors needed for fast allocation static Klass** boolArrayKlassObj_addr() { return &_boolArrayKlassObj; } diff --git a/hotspot/src/share/vm/opto/castnode.cpp b/hotspot/src/share/vm/opto/castnode.cpp index 3f3c5cab2ed..48aab726417 100644 --- a/hotspot/src/share/vm/opto/castnode.cpp +++ b/hotspot/src/share/vm/opto/castnode.cpp @@ -104,7 +104,8 @@ const Type *CastIINode::Value(PhaseTransform *phase) const { // Try to improve the type of the CastII if we recognize a CmpI/If // pattern. if (_carry_dependency) { - if (in(0) != NULL && (in(0)->is_IfFalse() || in(0)->is_IfTrue())) { + if (in(0) != NULL && in(0)->in(0) != NULL && in(0)->in(0)->is_If()) { + assert(in(0)->is_IfFalse() || in(0)->is_IfTrue(), "should be If proj"); Node* proj = in(0); if (proj->in(0)->in(1)->is_Bool()) { Node* b = proj->in(0)->in(1); diff --git a/hotspot/src/share/vm/opto/ifnode.cpp b/hotspot/src/share/vm/opto/ifnode.cpp index c0080c81d57..7b5f0d7b4be 100644 --- a/hotspot/src/share/vm/opto/ifnode.cpp +++ b/hotspot/src/share/vm/opto/ifnode.cpp @@ -820,6 +820,11 @@ static Node *remove_useless_bool(IfNode *iff, PhaseGVN *phase) { static IfNode* idealize_test(PhaseGVN* phase, IfNode* iff); +struct RangeCheck { + Node* ctl; + jint off; +}; + //------------------------------Ideal------------------------------------------ // Return a node which is more "ideal" than the current node. Strip out // control copies @@ -861,83 +866,141 @@ Node *IfNode::Ideal(PhaseGVN *phase, bool can_reshape) { jint offset1; int flip1 = is_range_check(range1, index1, offset1); if( flip1 ) { - Node *first_prev_dom = NULL; - // Try to remove extra range checks. All 'up_one_dom' gives up at merges // so all checks we inspect post-dominate the top-most check we find. // If we are going to fail the current check and we reach the top check // then we are guaranteed to fail, so just start interpreting there. - // We 'expand' the top 2 range checks to include all post-dominating + // We 'expand' the top 3 range checks to include all post-dominating // checks. - // The top 2 range checks seen - Node *prev_chk1 = NULL; - Node *prev_chk2 = NULL; + // The top 3 range checks seen + const int NRC =3; + RangeCheck prev_checks[NRC]; + int nb_checks = 0; + // Low and high offsets seen so far jint off_lo = offset1; jint off_hi = offset1; - // Scan for the top 2 checks and collect range of offsets - for( int dist = 0; dist < 999; dist++ ) { // Range-Check scan limit - if( dom->Opcode() == Op_If && // Not same opcode? - prev_dom->in(0) == dom ) { // One path of test does dominate? - if( dom == this ) return NULL; // dead loop + bool found_immediate_dominator = false; + + // Scan for the top checks and collect range of offsets + for (int dist = 0; dist < 999; dist++) { // Range-Check scan limit + if (dom->Opcode() == Op_If && // Not same opcode? + prev_dom->in(0) == dom) { // One path of test does dominate? + if (dom == this) return NULL; // dead loop // See if this is a range check Node *index2, *range2; jint offset2; int flip2 = dom->as_If()->is_range_check(range2, index2, offset2); // See if this is a _matching_ range check, checking against // the same array bounds. - if( flip2 == flip1 && range2 == range1 && index2 == index1 && - dom->outcnt() == 2 ) { + if (flip2 == flip1 && range2 == range1 && index2 == index1 && + dom->outcnt() == 2) { + if (nb_checks == 0 && dom->in(1) == in(1)) { + // Found an immediately dominating test at the same offset. + // This kind of back-to-back test can be eliminated locally, + // and there is no need to search further for dominating tests. + assert(offset2 == offset1, "Same test but different offsets"); + found_immediate_dominator = true; + break; + } // Gather expanded bounds off_lo = MIN2(off_lo,offset2); off_hi = MAX2(off_hi,offset2); - // Record top 2 range checks - prev_chk2 = prev_chk1; - prev_chk1 = prev_dom; - // If we match the test exactly, then the top test covers - // both our lower and upper bounds. - if( dom->in(1) == in(1) ) - prev_chk2 = prev_chk1; + // Record top NRC range checks + prev_checks[nb_checks%NRC].ctl = prev_dom; + prev_checks[nb_checks%NRC].off = offset2; + nb_checks++; } } prev_dom = dom; - dom = up_one_dom( dom ); - if( !dom ) break; + dom = up_one_dom(dom); + if (!dom) break; } + if (!found_immediate_dominator) { + // Attempt to widen the dominating range check to cover some later + // ones. Since range checks "fail" by uncommon-trapping to the + // interpreter, widening a check can make us speculatively enter + // the interpreter. If we see range-check deopt's, do not widen! + if (!phase->C->allow_range_check_smearing()) return NULL; - // Attempt to widen the dominating range check to cover some later - // ones. Since range checks "fail" by uncommon-trapping to the - // interpreter, widening a check can make us speculative enter the - // interpreter. If we see range-check deopt's, do not widen! - if (!phase->C->allow_range_check_smearing()) return NULL; - - // Constant indices only need to check the upper bound. - // Non-constance indices must check both low and high. - if( index1 ) { - // Didn't find 2 prior covering checks, so cannot remove anything. - if( !prev_chk2 ) return NULL; - // 'Widen' the offsets of the 1st and 2nd covering check - adjust_check( prev_chk1, range1, index1, flip1, off_lo, igvn ); - // Do not call adjust_check twice on the same projection - // as the first call may have transformed the BoolNode to a ConI - if( prev_chk1 != prev_chk2 ) { - adjust_check( prev_chk2, range1, index1, flip1, off_hi, igvn ); - } - // Test is now covered by prior checks, dominate it out - prev_dom = prev_chk2; - } else { // Didn't find prior covering check, so cannot remove anything. - if( !prev_chk1 ) return NULL; - // 'Widen' the offset of the 1st and only covering check - adjust_check( prev_chk1, range1, index1, flip1, off_hi, igvn ); - // Test is now covered by prior checks, dominate it out - prev_dom = prev_chk1; + if (nb_checks == 0) { + return NULL; + } + // Constant indices only need to check the upper bound. + // Non-constant indices must check both low and high. + int chk0 = (nb_checks - 1) % NRC; + if (index1) { + if (nb_checks == 1) { + return NULL; + } else { + // If the top range check's constant is the min or max of + // all constants we widen the next one to cover the whole + // range of constants. + RangeCheck rc0 = prev_checks[chk0]; + int chk1 = (nb_checks - 2) % NRC; + RangeCheck rc1 = prev_checks[chk1]; + if (rc0.off == off_lo) { + adjust_check(rc1.ctl, range1, index1, flip1, off_hi, igvn); + prev_dom = rc1.ctl; + } else if (rc0.off == off_hi) { + adjust_check(rc1.ctl, range1, index1, flip1, off_lo, igvn); + prev_dom = rc1.ctl; + } else { + // If the top test's constant is not the min or max of all + // constants, we need 3 range checks. We must leave the + // top test unchanged because widening it would allow the + // accesses it protects to successfully read/write out of + // bounds. + if (nb_checks == 2) { + return NULL; + } + int chk2 = (nb_checks - 3) % NRC; + RangeCheck rc2 = prev_checks[chk2]; + // The top range check a+i covers interval: -a <= i < length-a + // The second range check b+i covers interval: -b <= i < length-b + if (rc1.off <= rc0.off) { + // if b <= a, we change the second range check to: + // -min_of_all_constants <= i < length-min_of_all_constants + // Together top and second range checks now cover: + // -min_of_all_constants <= i < length-a + // which is more restrictive than -b <= i < length-b: + // -b <= -min_of_all_constants <= i < length-a <= length-b + // The third check is then changed to: + // -max_of_all_constants <= i < length-max_of_all_constants + // so 2nd and 3rd checks restrict allowed values of i to: + // -min_of_all_constants <= i < length-max_of_all_constants + adjust_check(rc1.ctl, range1, index1, flip1, off_lo, igvn); + adjust_check(rc2.ctl, range1, index1, flip1, off_hi, igvn); + } else { + // if b > a, we change the second range check to: + // -max_of_all_constants <= i < length-max_of_all_constants + // Together top and second range checks now cover: + // -a <= i < length-max_of_all_constants + // which is more restrictive than -b <= i < length-b: + // -b < -a <= i < length-max_of_all_constants <= length-b + // The third check is then changed to: + // -max_of_all_constants <= i < length-max_of_all_constants + // so 2nd and 3rd checks restrict allowed values of i to: + // -min_of_all_constants <= i < length-max_of_all_constants + adjust_check(rc1.ctl, range1, index1, flip1, off_hi, igvn); + adjust_check(rc2.ctl, range1, index1, flip1, off_lo, igvn); + } + prev_dom = rc2.ctl; + } + } + } else { + RangeCheck rc0 = prev_checks[chk0]; + // 'Widen' the offset of the 1st and only covering check + adjust_check(rc0.ctl, range1, index1, flip1, off_hi, igvn); + // Test is now covered by prior checks, dominate it out + prev_dom = rc0.ctl; + } } - } else { // Scan for an equivalent test Node *cmp; @@ -1019,7 +1082,7 @@ void IfNode::dominated_by( Node *prev_dom, PhaseIterGVN *igvn ) { // for lower and upper bounds. ProjNode* unc_proj = proj_out(1 - prev_dom->as_Proj()->_con)->as_Proj(); if (unc_proj->is_uncommon_trap_proj(Deoptimization::Reason_predicate)) - prev_dom = idom; + prev_dom = idom; // Now walk the current IfNode's projections. // Loop ends when 'this' has no more uses. diff --git a/hotspot/src/share/vm/opto/loopopts.cpp b/hotspot/src/share/vm/opto/loopopts.cpp index bfa483c0181..e00a47dbfda 100644 --- a/hotspot/src/share/vm/opto/loopopts.cpp +++ b/hotspot/src/share/vm/opto/loopopts.cpp @@ -241,8 +241,13 @@ void PhaseIdealLoop::dominated_by( Node *prevdom, Node *iff, bool flip, bool exc ProjNode* dp_proj = dp->as_Proj(); ProjNode* unc_proj = iff->as_If()->proj_out(1 - dp_proj->_con)->as_Proj(); if (exclude_loop_predicate && - unc_proj->is_uncommon_trap_proj(Deoptimization::Reason_predicate)) + (unc_proj->is_uncommon_trap_proj(Deoptimization::Reason_predicate) || + unc_proj->is_uncommon_trap_proj(Deoptimization::Reason_range_check))) { + // If this is a range check (IfNode::is_range_check), do not + // reorder because Compile::allow_range_check_smearing might have + // changed the check. return; // Let IGVN transformation change control dependence. + } IdealLoopTree *old_loop = get_loop(dp); @@ -898,23 +903,23 @@ void PhaseIdealLoop::split_if_with_blocks_post( Node *n ) { int n_op = n->Opcode(); // Check for an IF being dominated by another IF same test - if( n_op == Op_If ) { + if (n_op == Op_If) { Node *bol = n->in(1); uint max = bol->outcnt(); // Check for same test used more than once? - if( n_op == Op_If && max > 1 && bol->is_Bool() ) { + if (max > 1 && bol->is_Bool()) { // Search up IDOMs to see if this IF is dominated. Node *cutoff = get_ctrl(bol); // Now search up IDOMs till cutoff, looking for a dominating test Node *prevdom = n; Node *dom = idom(prevdom); - while( dom != cutoff ) { - if( dom->req() > 1 && dom->in(1) == bol && prevdom->in(0) == dom ) { + while (dom != cutoff) { + if (dom->req() > 1 && dom->in(1) == bol && prevdom->in(0) == dom) { // Replace the dominated test with an obvious true or false. // Place it on the IGVN worklist for later cleanup. C->set_major_progress(); - dominated_by( prevdom, n, false, true ); + dominated_by(prevdom, n, false, true); #ifndef PRODUCT if( VerifyLoopOptimizations ) verify(); #endif diff --git a/hotspot/src/share/vm/opto/macro.cpp b/hotspot/src/share/vm/opto/macro.cpp index 073945c833d..b393745620b 100644 --- a/hotspot/src/share/vm/opto/macro.cpp +++ b/hotspot/src/share/vm/opto/macro.cpp @@ -971,7 +971,11 @@ void PhaseMacroExpand::process_users_of_allocation(CallNode *alloc) { } bool PhaseMacroExpand::eliminate_allocate_node(AllocateNode *alloc) { - if (!EliminateAllocations || !alloc->_is_non_escaping) { + // Don't do scalar replacement if the frame can be popped by JVMTI: + // if reallocation fails during deoptimization we'll pop all + // interpreter frames for this compiled frame and that won't play + // nice with JVMTI popframe. + if (!EliminateAllocations || JvmtiExport::can_pop_frame() || !alloc->_is_non_escaping) { return false; } Node* klass = alloc->in(AllocateNode::KlassNode); diff --git a/hotspot/src/share/vm/prims/whitebox.hpp b/hotspot/src/share/vm/prims/whitebox.hpp index 4ead33f7fec..59754270e35 100644 --- a/hotspot/src/share/vm/prims/whitebox.hpp +++ b/hotspot/src/share/vm/prims/whitebox.hpp @@ -74,7 +74,7 @@ class WhiteBox : public AllStatic { static JavaThread* create_sweeper_thread(TRAPS); static int get_blob_type(const CodeBlob* code); static CodeHeap* get_code_heap(int blob_type); - static CodeBlob* allocate_code_blob(int blob_type, int size); + static CodeBlob* allocate_code_blob(int size, int blob_type); static int array_bytes_to_length(size_t bytes); static void register_methods(JNIEnv* env, jclass wbclass, JavaThread* thread, JNINativeMethod* method_array, int method_count); diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index d3dcac3c2b0..c94770f9195 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -125,8 +125,8 @@ char* Arguments::_meta_index_path = NULL; char* Arguments::_meta_index_dir = NULL; char* Arguments::_ext_dirs = NULL; -// Check if head of 'option' matches 'name', and sets 'tail' remaining part of option string - +// Check if head of 'option' matches 'name', and sets 'tail' to the remaining +// part of the option string. static bool match_option(const JavaVMOption *option, const char* name, const char** tail) { int len = (int)strlen(name); @@ -138,6 +138,32 @@ static bool match_option(const JavaVMOption *option, const char* name, } } +// Check if 'option' matches 'name'. No "tail" is allowed. +static bool match_option(const JavaVMOption *option, const char* name) { + const char* tail = NULL; + bool result = match_option(option, name, &tail); + if (tail != NULL && *tail == '\0') { + return result; + } else { + return false; + } +} + +// Return true if any of the strings in null-terminated array 'names' matches. +// If tail_allowed is true, then the tail must begin with a colon; otherwise, +// the option must match exactly. +static bool match_option(const JavaVMOption* option, const char** names, const char** tail, + bool tail_allowed) { + for (/* empty */; *names != NULL; ++names) { + if (match_option(option, *names, tail)) { + if (**tail == '\0' || tail_allowed && **tail == ':') { + return true; + } + } + } + return false; +} + static void logOption(const char* opt) { if (PrintVMOptions) { jio_fprintf(defaultStream::output_stream(), "VM option '%s'\n", opt); @@ -2526,21 +2552,6 @@ static const char* system_assertion_options[] = { "-dsa", "-esa", "-disablesystemassertions", "-enablesystemassertions", 0 }; -// Return true if any of the strings in null-terminated array 'names' matches. -// If tail_allowed is true, then the tail must begin with a colon; otherwise, -// the option must match exactly. -static bool match_option(const JavaVMOption* option, const char** names, const char** tail, - bool tail_allowed) { - for (/* empty */; *names != NULL; ++names) { - if (match_option(option, *names, tail)) { - if (**tail == '\0' || tail_allowed && **tail == ':') { - return true; - } - } - } - return false; -} - bool Arguments::parse_uintx(const char* value, uintx* uintx_arg, uintx min_size) { @@ -2782,16 +2793,16 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, } #endif // !INCLUDE_JVMTI // -Xnoclassgc - } else if (match_option(option, "-Xnoclassgc", &tail)) { + } else if (match_option(option, "-Xnoclassgc")) { FLAG_SET_CMDLINE(bool, ClassUnloading, false); // -Xconcgc - } else if (match_option(option, "-Xconcgc", &tail)) { + } else if (match_option(option, "-Xconcgc")) { FLAG_SET_CMDLINE(bool, UseConcMarkSweepGC, true); // -Xnoconcgc - } else if (match_option(option, "-Xnoconcgc", &tail)) { + } else if (match_option(option, "-Xnoconcgc")) { FLAG_SET_CMDLINE(bool, UseConcMarkSweepGC, false); // -Xbatch - } else if (match_option(option, "-Xbatch", &tail)) { + } else if (match_option(option, "-Xbatch")) { FLAG_SET_CMDLINE(bool, BackgroundCompilation, false); // -Xmn for compatibility with other JVM vendors } else if (match_option(option, "-Xmn", &tail)) { @@ -2936,28 +2947,28 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, } FLAG_SET_CMDLINE(uintx, IncreaseFirstTierCompileThresholdAt, (uintx)uint_IncreaseFirstTierCompileThresholdAt); // -green - } else if (match_option(option, "-green", &tail)) { + } else if (match_option(option, "-green")) { jio_fprintf(defaultStream::error_stream(), "Green threads support not available\n"); return JNI_EINVAL; // -native - } else if (match_option(option, "-native", &tail)) { + } else if (match_option(option, "-native")) { // HotSpot always uses native threads, ignore silently for compatibility // -Xsqnopause - } else if (match_option(option, "-Xsqnopause", &tail)) { + } else if (match_option(option, "-Xsqnopause")) { // EVM option, ignore silently for compatibility // -Xrs - } else if (match_option(option, "-Xrs", &tail)) { + } else if (match_option(option, "-Xrs")) { // Classic/EVM option, new functionality FLAG_SET_CMDLINE(bool, ReduceSignalUsage, true); - } else if (match_option(option, "-Xusealtsigs", &tail)) { + } else if (match_option(option, "-Xusealtsigs")) { // change default internal VM signals used - lower case for back compat FLAG_SET_CMDLINE(bool, UseAltSigs, true); // -Xoptimize - } else if (match_option(option, "-Xoptimize", &tail)) { + } else if (match_option(option, "-Xoptimize")) { // EVM option, ignore silently for compatibility // -Xprof - } else if (match_option(option, "-Xprof", &tail)) { + } else if (match_option(option, "-Xprof")) { #if INCLUDE_FPROF _has_profile = true; #else // INCLUDE_FPROF @@ -2966,7 +2977,7 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, return JNI_ERR; #endif // INCLUDE_FPROF // -Xconcurrentio - } else if (match_option(option, "-Xconcurrentio", &tail)) { + } else if (match_option(option, "-Xconcurrentio")) { FLAG_SET_CMDLINE(bool, UseLWPSynchronization, true); FLAG_SET_CMDLINE(bool, BackgroundCompilation, false); FLAG_SET_CMDLINE(intx, DeferThrSuspendLoopCount, 1); @@ -2974,13 +2985,13 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, FLAG_SET_CMDLINE(uintx, NewSizeThreadIncrease, 16 * K); // 20Kb per thread added to new generation // -Xinternalversion - } else if (match_option(option, "-Xinternalversion", &tail)) { + } else if (match_option(option, "-Xinternalversion")) { jio_fprintf(defaultStream::output_stream(), "%s\n", VM_Version::internal_vm_info_string()); vm_exit(0); #ifndef PRODUCT // -Xprintflags - } else if (match_option(option, "-Xprintflags", &tail)) { + } else if (match_option(option, "-Xprintflags")) { CommandLineFlags::printFlags(tty, false); vm_exit(0); #endif @@ -3014,29 +3025,29 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, #endif } // -Xint - } else if (match_option(option, "-Xint", &tail)) { + } else if (match_option(option, "-Xint")) { set_mode_flags(_int); // -Xmixed - } else if (match_option(option, "-Xmixed", &tail)) { + } else if (match_option(option, "-Xmixed")) { set_mode_flags(_mixed); // -Xcomp - } else if (match_option(option, "-Xcomp", &tail)) { + } else if (match_option(option, "-Xcomp")) { // for testing the compiler; turn off all flags that inhibit compilation set_mode_flags(_comp); // -Xshare:dump - } else if (match_option(option, "-Xshare:dump", &tail)) { + } else if (match_option(option, "-Xshare:dump")) { FLAG_SET_CMDLINE(bool, DumpSharedSpaces, true); set_mode_flags(_int); // Prevent compilation, which creates objects // -Xshare:on - } else if (match_option(option, "-Xshare:on", &tail)) { + } else if (match_option(option, "-Xshare:on")) { FLAG_SET_CMDLINE(bool, UseSharedSpaces, true); FLAG_SET_CMDLINE(bool, RequireSharedSpaces, true); // -Xshare:auto - } else if (match_option(option, "-Xshare:auto", &tail)) { + } else if (match_option(option, "-Xshare:auto")) { FLAG_SET_CMDLINE(bool, UseSharedSpaces, true); FLAG_SET_CMDLINE(bool, RequireSharedSpaces, false); // -Xshare:off - } else if (match_option(option, "-Xshare:off", &tail)) { + } else if (match_option(option, "-Xshare:off")) { FLAG_SET_CMDLINE(bool, UseSharedSpaces, false); FLAG_SET_CMDLINE(bool, RequireSharedSpaces, false); // -Xverify @@ -3054,13 +3065,13 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, return JNI_EINVAL; } // -Xdebug - } else if (match_option(option, "-Xdebug", &tail)) { + } else if (match_option(option, "-Xdebug")) { // note this flag has been used, then ignore set_xdebug_mode(true); // -Xnoagent - } else if (match_option(option, "-Xnoagent", &tail)) { + } else if (match_option(option, "-Xnoagent")) { // For compatibility with classic. HotSpot refuses to load the old style agent.dll. - } else if (match_option(option, "-Xboundthreads", &tail)) { + } else if (match_option(option, "-Xboundthreads")) { // Bind user level threads to kernel threads (Solaris only) FLAG_SET_CMDLINE(bool, UseBoundThreads, true); } else if (match_option(option, "-Xloggc:", &tail)) { @@ -3090,14 +3101,14 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, "check")) { return JNI_EINVAL; } - } else if (match_option(option, "vfprintf", &tail)) { + } else if (match_option(option, "vfprintf")) { _vfprintf_hook = CAST_TO_FN_PTR(vfprintf_hook_t, option->extraInfo); - } else if (match_option(option, "exit", &tail)) { + } else if (match_option(option, "exit")) { _exit_hook = CAST_TO_FN_PTR(exit_hook_t, option->extraInfo); - } else if (match_option(option, "abort", &tail)) { + } else if (match_option(option, "abort")) { _abort_hook = CAST_TO_FN_PTR(abort_hook_t, option->extraInfo); // -XX:+AggressiveHeap - } else if (match_option(option, "-XX:+AggressiveHeap", &tail)) { + } else if (match_option(option, "-XX:+AggressiveHeap")) { // This option inspects the machine and attempts to set various // parameters to be optimal for long-running, memory allocation @@ -3188,11 +3199,11 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, // Need to keep consistency of MaxTenuringThreshold and AlwaysTenure/NeverTenure; // and the last option wins. - } else if (match_option(option, "-XX:+NeverTenure", &tail)) { + } else if (match_option(option, "-XX:+NeverTenure")) { FLAG_SET_CMDLINE(bool, NeverTenure, true); FLAG_SET_CMDLINE(bool, AlwaysTenure, false); FLAG_SET_CMDLINE(uintx, MaxTenuringThreshold, markOopDesc::max_age + 1); - } else if (match_option(option, "-XX:+AlwaysTenure", &tail)) { + } else if (match_option(option, "-XX:+AlwaysTenure")) { FLAG_SET_CMDLINE(bool, NeverTenure, false); FLAG_SET_CMDLINE(bool, AlwaysTenure, true); FLAG_SET_CMDLINE(uintx, MaxTenuringThreshold, 0); @@ -3211,17 +3222,17 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, FLAG_SET_CMDLINE(bool, NeverTenure, false); FLAG_SET_CMDLINE(bool, AlwaysTenure, false); } - } else if (match_option(option, "-XX:+CMSPermGenSweepingEnabled", &tail) || - match_option(option, "-XX:-CMSPermGenSweepingEnabled", &tail)) { + } else if (match_option(option, "-XX:+CMSPermGenSweepingEnabled") || + match_option(option, "-XX:-CMSPermGenSweepingEnabled")) { jio_fprintf(defaultStream::error_stream(), "Please use CMSClassUnloadingEnabled in place of " "CMSPermGenSweepingEnabled in the future\n"); - } else if (match_option(option, "-XX:+UseGCTimeLimit", &tail)) { + } else if (match_option(option, "-XX:+UseGCTimeLimit")) { FLAG_SET_CMDLINE(bool, UseGCOverheadLimit, true); jio_fprintf(defaultStream::error_stream(), "Please use -XX:+UseGCOverheadLimit in place of " "-XX:+UseGCTimeLimit in the future\n"); - } else if (match_option(option, "-XX:-UseGCTimeLimit", &tail)) { + } else if (match_option(option, "-XX:-UseGCTimeLimit")) { FLAG_SET_CMDLINE(bool, UseGCOverheadLimit, false); jio_fprintf(defaultStream::error_stream(), "Please use -XX:-UseGCOverheadLimit in place of " @@ -3231,13 +3242,13 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, // are not to be documented. } else if (match_option(option, "-XX:MaxTLERatio=", &tail)) { // No longer used. - } else if (match_option(option, "-XX:+ResizeTLE", &tail)) { + } else if (match_option(option, "-XX:+ResizeTLE")) { FLAG_SET_CMDLINE(bool, ResizeTLAB, true); - } else if (match_option(option, "-XX:-ResizeTLE", &tail)) { + } else if (match_option(option, "-XX:-ResizeTLE")) { FLAG_SET_CMDLINE(bool, ResizeTLAB, false); - } else if (match_option(option, "-XX:+PrintTLE", &tail)) { + } else if (match_option(option, "-XX:+PrintTLE")) { FLAG_SET_CMDLINE(bool, PrintTLAB, true); - } else if (match_option(option, "-XX:-PrintTLE", &tail)) { + } else if (match_option(option, "-XX:-PrintTLE")) { FLAG_SET_CMDLINE(bool, PrintTLAB, false); } else if (match_option(option, "-XX:TLEFragmentationRatio=", &tail)) { // No longer used. @@ -3253,17 +3264,17 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, FLAG_SET_CMDLINE(uintx, TLABSize, long_tlab_size); } else if (match_option(option, "-XX:TLEThreadRatio=", &tail)) { // No longer used. - } else if (match_option(option, "-XX:+UseTLE", &tail)) { + } else if (match_option(option, "-XX:+UseTLE")) { FLAG_SET_CMDLINE(bool, UseTLAB, true); - } else if (match_option(option, "-XX:-UseTLE", &tail)) { + } else if (match_option(option, "-XX:-UseTLE")) { FLAG_SET_CMDLINE(bool, UseTLAB, false); - } else if (match_option(option, "-XX:+DisplayVMOutputToStderr", &tail)) { + } else if (match_option(option, "-XX:+DisplayVMOutputToStderr")) { FLAG_SET_CMDLINE(bool, DisplayVMOutputToStdout, false); FLAG_SET_CMDLINE(bool, DisplayVMOutputToStderr, true); - } else if (match_option(option, "-XX:+DisplayVMOutputToStdout", &tail)) { + } else if (match_option(option, "-XX:+DisplayVMOutputToStdout")) { FLAG_SET_CMDLINE(bool, DisplayVMOutputToStderr, false); FLAG_SET_CMDLINE(bool, DisplayVMOutputToStdout, true); - } else if (match_option(option, "-XX:+ExtendedDTraceProbes", &tail)) { + } else if (match_option(option, "-XX:+ExtendedDTraceProbes")) { #if defined(DTRACE_ENABLED) FLAG_SET_CMDLINE(bool, ExtendedDTraceProbes, true); FLAG_SET_CMDLINE(bool, DTraceMethodProbes, true); @@ -3275,7 +3286,7 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, return JNI_EINVAL; #endif // defined(DTRACE_ENABLED) #ifdef ASSERT - } else if (match_option(option, "-XX:+FullGCALot", &tail)) { + } else if (match_option(option, "-XX:+FullGCALot")) { FLAG_SET_CMDLINE(bool, FullGCALot, true); // disable scavenge before parallel mark-compact FLAG_SET_CMDLINE(bool, ScavengeBeforeFullGC, false); @@ -3361,7 +3372,7 @@ jint Arguments::parse_each_vm_init_arg(const JavaVMInitArgs* args, } FLAG_SET_CMDLINE(uintx, MaxDirectMemorySize, max_direct_memory_size); #if !INCLUDE_MANAGEMENT - } else if (match_option(option, "-XX:+ManagementServer", &tail)) { + } else if (match_option(option, "-XX:+ManagementServer")) { jio_fprintf(defaultStream::error_stream(), "ManagementServer is not supported in this VM.\n"); return JNI_ERR; @@ -3796,23 +3807,23 @@ jint Arguments::parse(const JavaVMInitArgs* args) { settings_file_specified = true; continue; } - if (match_option(option, "-XX:+PrintVMOptions", &tail)) { + if (match_option(option, "-XX:+PrintVMOptions")) { PrintVMOptions = true; continue; } - if (match_option(option, "-XX:-PrintVMOptions", &tail)) { + if (match_option(option, "-XX:-PrintVMOptions")) { PrintVMOptions = false; continue; } - if (match_option(option, "-XX:+IgnoreUnrecognizedVMOptions", &tail)) { + if (match_option(option, "-XX:+IgnoreUnrecognizedVMOptions")) { IgnoreUnrecognizedVMOptions = true; continue; } - if (match_option(option, "-XX:-IgnoreUnrecognizedVMOptions", &tail)) { + if (match_option(option, "-XX:-IgnoreUnrecognizedVMOptions")) { IgnoreUnrecognizedVMOptions = false; continue; } - if (match_option(option, "-XX:+PrintFlagsInitial", &tail)) { + if (match_option(option, "-XX:+PrintFlagsInitial")) { CommandLineFlags::printFlags(tty, false); vm_exit(0); } @@ -3838,7 +3849,7 @@ jint Arguments::parse(const JavaVMInitArgs* args) { #ifndef PRODUCT - if (match_option(option, "-XX:+PrintFlagsWithComments", &tail)) { + if (match_option(option, "-XX:+PrintFlagsWithComments")) { CommandLineFlags::printFlags(tty, true); vm_exit(0); } diff --git a/hotspot/src/share/vm/runtime/deoptimization.cpp b/hotspot/src/share/vm/runtime/deoptimization.cpp index 75da1fef019..90156bfd4ca 100644 --- a/hotspot/src/share/vm/runtime/deoptimization.cpp +++ b/hotspot/src/share/vm/runtime/deoptimization.cpp @@ -176,6 +176,8 @@ Deoptimization::UnrollBlock* Deoptimization::fetch_unroll_info_helper(JavaThread assert(vf->is_compiled_frame(), "Wrong frame type"); chunk->push(compiledVFrame::cast(vf)); + bool realloc_failures = false; + #ifdef COMPILER2 // Reallocate the non-escaping objects and restore their fields. Then // relock objects if synchronization on them was eliminated. @@ -206,19 +208,16 @@ Deoptimization::UnrollBlock* Deoptimization::fetch_unroll_info_helper(JavaThread tty->print_cr("SAVED OOP RESULT " INTPTR_FORMAT " in thread " INTPTR_FORMAT, (void *)result, thread); } } - bool reallocated = false; if (objects != NULL) { JRT_BLOCK - reallocated = realloc_objects(thread, &deoptee, objects, THREAD); + realloc_failures = realloc_objects(thread, &deoptee, objects, THREAD); JRT_END - } - if (reallocated) { - reassign_fields(&deoptee, &map, objects); + reassign_fields(&deoptee, &map, objects, realloc_failures); #ifndef PRODUCT if (TraceDeoptimization) { ttyLocker ttyl; tty->print_cr("REALLOC OBJECTS in thread " INTPTR_FORMAT, thread); - print_objects(objects); + print_objects(objects, realloc_failures); } #endif } @@ -236,7 +235,7 @@ Deoptimization::UnrollBlock* Deoptimization::fetch_unroll_info_helper(JavaThread assert (cvf->scope() != NULL,"expect only compiled java frames"); GrowableArray* monitors = cvf->monitors(); if (monitors->is_nonempty()) { - relock_objects(monitors, thread); + relock_objects(monitors, thread, realloc_failures); #ifndef PRODUCT if (TraceDeoptimization) { ttyLocker ttyl; @@ -247,7 +246,12 @@ Deoptimization::UnrollBlock* Deoptimization::fetch_unroll_info_helper(JavaThread first = false; tty->print_cr("RELOCK OBJECTS in thread " INTPTR_FORMAT, thread); } - tty->print_cr(" object <" INTPTR_FORMAT "> locked", (void *)mi->owner()); + if (mi->owner_is_scalar_replaced()) { + Klass* k = java_lang_Class::as_Klass(mi->owner_klass()); + tty->print_cr(" failed reallocation for klass %s", k->external_name()); + } else { + tty->print_cr(" object <" INTPTR_FORMAT "> locked", (void *)mi->owner()); + } } } } @@ -262,9 +266,14 @@ Deoptimization::UnrollBlock* Deoptimization::fetch_unroll_info_helper(JavaThread // out the java state residing in the vframeArray will be missed. No_Safepoint_Verifier no_safepoint; - vframeArray* array = create_vframeArray(thread, deoptee, &map, chunk); + vframeArray* array = create_vframeArray(thread, deoptee, &map, chunk, realloc_failures); +#ifdef COMPILER2 + if (realloc_failures) { + pop_frames_failed_reallocs(thread, array); + } +#endif - assert(thread->vframe_array_head() == NULL, "Pending deopt!");; + assert(thread->vframe_array_head() == NULL, "Pending deopt!"); thread->set_vframe_array_head(array); // Now that the vframeArray has been created if we have any deferred local writes @@ -718,6 +727,8 @@ bool Deoptimization::realloc_objects(JavaThread* thread, frame* fr, GrowableArra int exception_line = thread->exception_line(); thread->clear_pending_exception(); + bool failures = false; + for (int i = 0; i < objects->length(); i++) { assert(objects->at(i)->is_object(), "invalid debug information"); ObjectValue* sv = (ObjectValue*) objects->at(i); @@ -727,27 +738,34 @@ bool Deoptimization::realloc_objects(JavaThread* thread, frame* fr, GrowableArra if (k->oop_is_instance()) { InstanceKlass* ik = InstanceKlass::cast(k()); - obj = ik->allocate_instance(CHECK_(false)); + obj = ik->allocate_instance(THREAD); } else if (k->oop_is_typeArray()) { TypeArrayKlass* ak = TypeArrayKlass::cast(k()); assert(sv->field_size() % type2size[ak->element_type()] == 0, "non-integral array length"); int len = sv->field_size() / type2size[ak->element_type()]; - obj = ak->allocate(len, CHECK_(false)); + obj = ak->allocate(len, THREAD); } else if (k->oop_is_objArray()) { ObjArrayKlass* ak = ObjArrayKlass::cast(k()); - obj = ak->allocate(sv->field_size(), CHECK_(false)); + obj = ak->allocate(sv->field_size(), THREAD); + } + + if (obj == NULL) { + failures = true; } - assert(obj != NULL, "allocation failed"); assert(sv->value().is_null(), "redundant reallocation"); + assert(obj != NULL || HAS_PENDING_EXCEPTION, "allocation should succeed or we should get an exception"); + CLEAR_PENDING_EXCEPTION; sv->set_value(obj); } - if (pending_exception.not_null()) { + if (failures) { + THROW_OOP_(Universe::out_of_memory_error_realloc_objects(), failures); + } else if (pending_exception.not_null()) { thread->set_pending_exception(pending_exception(), exception_file, exception_line); } - return true; + return failures; } // This assumes that the fields are stored in ObjectValue in the same order @@ -885,12 +903,15 @@ void Deoptimization::reassign_object_array_elements(frame* fr, RegisterMap* reg_ // restore fields of all eliminated objects and arrays -void Deoptimization::reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray* objects) { +void Deoptimization::reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray* objects, bool realloc_failures) { for (int i = 0; i < objects->length(); i++) { ObjectValue* sv = (ObjectValue*) objects->at(i); KlassHandle k(java_lang_Class::as_Klass(sv->klass()->as_ConstantOopReadValue()->value()())); Handle obj = sv->value(); - assert(obj.not_null(), "reallocation was missed"); + assert(obj.not_null() || realloc_failures, "reallocation was missed"); + if (obj.is_null()) { + continue; + } if (k->oop_is_instance()) { InstanceKlass* ik = InstanceKlass::cast(k()); @@ -907,34 +928,36 @@ void Deoptimization::reassign_fields(frame* fr, RegisterMap* reg_map, GrowableAr // relock objects for which synchronization was eliminated -void Deoptimization::relock_objects(GrowableArray* monitors, JavaThread* thread) { +void Deoptimization::relock_objects(GrowableArray* monitors, JavaThread* thread, bool realloc_failures) { for (int i = 0; i < monitors->length(); i++) { MonitorInfo* mon_info = monitors->at(i); if (mon_info->eliminated()) { - assert(mon_info->owner() != NULL, "reallocation was missed"); - Handle obj = Handle(mon_info->owner()); - markOop mark = obj->mark(); - if (UseBiasedLocking && mark->has_bias_pattern()) { - // New allocated objects may have the mark set to anonymously biased. - // Also the deoptimized method may called methods with synchronization - // where the thread-local object is bias locked to the current thread. - assert(mark->is_biased_anonymously() || - mark->biased_locker() == thread, "should be locked to current thread"); - // Reset mark word to unbiased prototype. - markOop unbiased_prototype = markOopDesc::prototype()->set_age(mark->age()); - obj->set_mark(unbiased_prototype); + assert(!mon_info->owner_is_scalar_replaced() || realloc_failures, "reallocation was missed"); + if (!mon_info->owner_is_scalar_replaced()) { + Handle obj = Handle(mon_info->owner()); + markOop mark = obj->mark(); + if (UseBiasedLocking && mark->has_bias_pattern()) { + // New allocated objects may have the mark set to anonymously biased. + // Also the deoptimized method may called methods with synchronization + // where the thread-local object is bias locked to the current thread. + assert(mark->is_biased_anonymously() || + mark->biased_locker() == thread, "should be locked to current thread"); + // Reset mark word to unbiased prototype. + markOop unbiased_prototype = markOopDesc::prototype()->set_age(mark->age()); + obj->set_mark(unbiased_prototype); + } + BasicLock* lock = mon_info->lock(); + ObjectSynchronizer::slow_enter(obj, lock, thread); + assert(mon_info->owner()->is_locked(), "object must be locked now"); } - BasicLock* lock = mon_info->lock(); - ObjectSynchronizer::slow_enter(obj, lock, thread); } - assert(mon_info->owner()->is_locked(), "object must be locked now"); } } #ifndef PRODUCT // print information about reallocated objects -void Deoptimization::print_objects(GrowableArray* objects) { +void Deoptimization::print_objects(GrowableArray* objects, bool realloc_failures) { fieldDescriptor fd; for (int i = 0; i < objects->length(); i++) { @@ -944,10 +967,15 @@ void Deoptimization::print_objects(GrowableArray* objects) { tty->print(" object <" INTPTR_FORMAT "> of type ", (void *)sv->value()()); k->print_value(); - tty->print(" allocated (%d bytes)", obj->size() * HeapWordSize); + assert(obj.not_null() || realloc_failures, "reallocation was missed"); + if (obj.is_null()) { + tty->print(" allocation failed"); + } else { + tty->print(" allocated (%d bytes)", obj->size() * HeapWordSize); + } tty->cr(); - if (Verbose) { + if (Verbose && !obj.is_null()) { k->oop_print_on(obj(), tty); } } @@ -955,7 +983,7 @@ void Deoptimization::print_objects(GrowableArray* objects) { #endif #endif // COMPILER2 -vframeArray* Deoptimization::create_vframeArray(JavaThread* thread, frame fr, RegisterMap *reg_map, GrowableArray* chunk) { +vframeArray* Deoptimization::create_vframeArray(JavaThread* thread, frame fr, RegisterMap *reg_map, GrowableArray* chunk, bool realloc_failures) { Events::log(thread, "DEOPT PACKING pc=" INTPTR_FORMAT " sp=" INTPTR_FORMAT, fr.pc(), fr.sp()); #ifndef PRODUCT @@ -998,7 +1026,7 @@ vframeArray* Deoptimization::create_vframeArray(JavaThread* thread, frame fr, Re // Since the Java thread being deoptimized will eventually adjust it's own stack, // the vframeArray containing the unpacking information is allocated in the C heap. // For Compiler1, the caller of the deoptimized frame is saved for use by unpack_frames(). - vframeArray* array = vframeArray::allocate(thread, frame_size, chunk, reg_map, sender, caller, fr); + vframeArray* array = vframeArray::allocate(thread, frame_size, chunk, reg_map, sender, caller, fr, realloc_failures); // Compare the vframeArray to the collected vframes assert(array->structural_compare(thread, chunk), "just checking"); @@ -1013,6 +1041,33 @@ vframeArray* Deoptimization::create_vframeArray(JavaThread* thread, frame fr, Re return array; } +#ifdef COMPILER2 +void Deoptimization::pop_frames_failed_reallocs(JavaThread* thread, vframeArray* array) { + // Reallocation of some scalar replaced objects failed. Record + // that we need to pop all the interpreter frames for the + // deoptimized compiled frame. + assert(thread->frames_to_pop_failed_realloc() == 0, "missed frames to pop?"); + thread->set_frames_to_pop_failed_realloc(array->frames()); + // Unlock all monitors here otherwise the interpreter will see a + // mix of locked and unlocked monitors (because of failed + // reallocations of synchronized objects) and be confused. + for (int i = 0; i < array->frames(); i++) { + MonitorChunk* monitors = array->element(i)->monitors(); + if (monitors != NULL) { + for (int j = 0; j < monitors->number_of_monitors(); j++) { + BasicObjectLock* src = monitors->at(j); + if (src->obj() != NULL) { + ObjectSynchronizer::fast_exit(src->obj(), src->lock(), thread); + } + } + array->element(i)->free_monitors(thread); +#ifdef ASSERT + array->element(i)->set_removed_monitors(); +#endif + } + } +} +#endif static void collect_monitors(compiledVFrame* cvf, GrowableArray* objects_to_revoke) { GrowableArray* monitors = cvf->monitors(); diff --git a/hotspot/src/share/vm/runtime/deoptimization.hpp b/hotspot/src/share/vm/runtime/deoptimization.hpp index ee461196bd0..e04ad5a0043 100644 --- a/hotspot/src/share/vm/runtime/deoptimization.hpp +++ b/hotspot/src/share/vm/runtime/deoptimization.hpp @@ -125,13 +125,14 @@ class Deoptimization : AllStatic { static bool realloc_objects(JavaThread* thread, frame* fr, GrowableArray* objects, TRAPS); static void reassign_type_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, typeArrayOop obj, BasicType type); static void reassign_object_array_elements(frame* fr, RegisterMap* reg_map, ObjectValue* sv, objArrayOop obj); - static void reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray* objects); - static void relock_objects(GrowableArray* monitors, JavaThread* thread); - NOT_PRODUCT(static void print_objects(GrowableArray* objects);) + static void reassign_fields(frame* fr, RegisterMap* reg_map, GrowableArray* objects, bool realloc_failures); + static void relock_objects(GrowableArray* monitors, JavaThread* thread, bool realloc_failures); + static void pop_frames_failed_reallocs(JavaThread* thread, vframeArray* array); + NOT_PRODUCT(static void print_objects(GrowableArray* objects, bool realloc_failures);) #endif // COMPILER2 public: - static vframeArray* create_vframeArray(JavaThread* thread, frame fr, RegisterMap *reg_map, GrowableArray* chunk); + static vframeArray* create_vframeArray(JavaThread* thread, frame fr, RegisterMap *reg_map, GrowableArray* chunk, bool realloc_failures); // Interface used for unpacking deoptimized frames diff --git a/hotspot/src/share/vm/runtime/sharedRuntime.cpp b/hotspot/src/share/vm/runtime/sharedRuntime.cpp index 409a867afaf..fa1f5672292 100644 --- a/hotspot/src/share/vm/runtime/sharedRuntime.cpp +++ b/hotspot/src/share/vm/runtime/sharedRuntime.cpp @@ -456,6 +456,7 @@ JRT_END address SharedRuntime::raw_exception_handler_for_return_address(JavaThread* thread, address return_address) { assert(frame::verify_return_pc(return_address), err_msg("must be a return address: " INTPTR_FORMAT, return_address)); + assert(thread->frames_to_pop_failed_realloc() == 0 || Interpreter::contains(return_address), "missed frames to pop?"); // Reset method handle flag. thread->set_is_method_handle_return(false); diff --git a/hotspot/src/share/vm/runtime/thread.cpp b/hotspot/src/share/vm/runtime/thread.cpp index bebc7d73123..9a7df7a4928 100644 --- a/hotspot/src/share/vm/runtime/thread.cpp +++ b/hotspot/src/share/vm/runtime/thread.cpp @@ -1449,6 +1449,7 @@ void JavaThread::initialize() { _popframe_condition = popframe_inactive; _popframe_preserved_args = NULL; _popframe_preserved_args_size = 0; + _frames_to_pop_failed_realloc = 0; pd_initialize(); } diff --git a/hotspot/src/share/vm/runtime/thread.hpp b/hotspot/src/share/vm/runtime/thread.hpp index 44e10aae90b..399a2cbe671 100644 --- a/hotspot/src/share/vm/runtime/thread.hpp +++ b/hotspot/src/share/vm/runtime/thread.hpp @@ -908,6 +908,12 @@ class JavaThread: public Thread { // This is set to popframe_pending to signal that top Java frame should be popped immediately int _popframe_condition; + // If reallocation of scalar replaced objects fails, we throw OOM + // and during exception propagation, pop the top + // _frames_to_pop_failed_realloc frames, the ones that reference + // failed reallocations. + int _frames_to_pop_failed_realloc; + #ifndef PRODUCT int _jmp_ring_index; struct { @@ -1567,6 +1573,10 @@ class JavaThread: public Thread { void clr_pop_frame_in_process(void) { _popframe_condition &= ~popframe_processing_bit; } #endif + int frames_to_pop_failed_realloc() const { return _frames_to_pop_failed_realloc; } + void set_frames_to_pop_failed_realloc(int nb) { _frames_to_pop_failed_realloc = nb; } + void dec_frames_to_pop_failed_realloc() { _frames_to_pop_failed_realloc--; } + private: // Saved incoming arguments to popped frame. // Used only when popped interpreted frame returns to deoptimized frame. diff --git a/hotspot/src/share/vm/runtime/vframeArray.cpp b/hotspot/src/share/vm/runtime/vframeArray.cpp index 6a3652c0ea1..d3e989e59e2 100644 --- a/hotspot/src/share/vm/runtime/vframeArray.cpp +++ b/hotspot/src/share/vm/runtime/vframeArray.cpp @@ -57,7 +57,7 @@ void vframeArrayElement::free_monitors(JavaThread* jt) { } } -void vframeArrayElement::fill_in(compiledVFrame* vf) { +void vframeArrayElement::fill_in(compiledVFrame* vf, bool realloc_failures) { // Copy the information from the compiled vframe to the // interpreter frame we will be creating to replace vf @@ -65,6 +65,9 @@ void vframeArrayElement::fill_in(compiledVFrame* vf) { _method = vf->method(); _bci = vf->raw_bci(); _reexecute = vf->should_reexecute(); +#ifdef ASSERT + _removed_monitors = false; +#endif int index; @@ -82,11 +85,15 @@ void vframeArrayElement::fill_in(compiledVFrame* vf) { // Migrate the BasicLocks from the stack to the monitor chunk for (index = 0; index < list->length(); index++) { MonitorInfo* monitor = list->at(index); - assert(!monitor->owner_is_scalar_replaced(), "object should be reallocated already"); - assert(monitor->owner() == NULL || (!monitor->owner()->is_unlocked() && !monitor->owner()->has_bias_pattern()), "object must be null or locked, and unbiased"); + assert(!monitor->owner_is_scalar_replaced() || realloc_failures, "object should be reallocated already"); BasicObjectLock* dest = _monitors->at(index); - dest->set_obj(monitor->owner()); - monitor->lock()->move_to(monitor->owner(), dest->lock()); + if (monitor->owner_is_scalar_replaced()) { + dest->set_obj(NULL); + } else { + assert(monitor->owner() == NULL || (!monitor->owner()->is_unlocked() && !monitor->owner()->has_bias_pattern()), "object must be null or locked, and unbiased"); + dest->set_obj(monitor->owner()); + monitor->lock()->move_to(monitor->owner(), dest->lock()); + } } } @@ -111,7 +118,7 @@ void vframeArrayElement::fill_in(compiledVFrame* vf) { StackValue* value = locs->at(index); switch(value->type()) { case T_OBJECT: - assert(!value->obj_is_scalar_replaced(), "object should be reallocated already"); + assert(!value->obj_is_scalar_replaced() || realloc_failures, "object should be reallocated already"); // preserve object type _locals->add( new StackValue(cast_from_oop((value->get_obj()())), T_OBJECT )); break; @@ -136,7 +143,7 @@ void vframeArrayElement::fill_in(compiledVFrame* vf) { StackValue* value = exprs->at(index); switch(value->type()) { case T_OBJECT: - assert(!value->obj_is_scalar_replaced(), "object should be reallocated already"); + assert(!value->obj_is_scalar_replaced() || realloc_failures, "object should be reallocated already"); // preserve object type _expressions->add( new StackValue(cast_from_oop((value->get_obj()())), T_OBJECT )); break; @@ -287,7 +294,7 @@ void vframeArrayElement::unpack_on_stack(int caller_actual_parameters, _frame.patch_pc(thread, pc); - assert (!method()->is_synchronized() || locks > 0, "synchronized methods must have monitors"); + assert (!method()->is_synchronized() || locks > 0 || _removed_monitors, "synchronized methods must have monitors"); BasicObjectLock* top = iframe()->interpreter_frame_monitor_begin(); for (int index = 0; index < locks; index++) { @@ -439,7 +446,8 @@ int vframeArrayElement::on_stack_size(int callee_parameters, vframeArray* vframeArray::allocate(JavaThread* thread, int frame_size, GrowableArray* chunk, - RegisterMap *reg_map, frame sender, frame caller, frame self) { + RegisterMap *reg_map, frame sender, frame caller, frame self, + bool realloc_failures) { // Allocate the vframeArray vframeArray * result = (vframeArray*) AllocateHeap(sizeof(vframeArray) + // fixed part @@ -451,19 +459,20 @@ vframeArray* vframeArray::allocate(JavaThread* thread, int frame_size, GrowableA result->_caller = caller; result->_original = self; result->set_unroll_block(NULL); // initialize it - result->fill_in(thread, frame_size, chunk, reg_map); + result->fill_in(thread, frame_size, chunk, reg_map, realloc_failures); return result; } void vframeArray::fill_in(JavaThread* thread, int frame_size, GrowableArray* chunk, - const RegisterMap *reg_map) { + const RegisterMap *reg_map, + bool realloc_failures) { // Set owner first, it is used when adding monitor chunks _frame_size = frame_size; for(int i = 0; i < chunk->length(); i++) { - element(i)->fill_in(chunk->at(i)); + element(i)->fill_in(chunk->at(i), realloc_failures); } // Copy registers for callee-saved registers diff --git a/hotspot/src/share/vm/runtime/vframeArray.hpp b/hotspot/src/share/vm/runtime/vframeArray.hpp index e4665c40d36..890c386ba75 100644 --- a/hotspot/src/share/vm/runtime/vframeArray.hpp +++ b/hotspot/src/share/vm/runtime/vframeArray.hpp @@ -58,6 +58,9 @@ class vframeArrayElement : public _ValueObj { MonitorChunk* _monitors; // active monitors for this vframe StackValueCollection* _locals; StackValueCollection* _expressions; +#ifdef ASSERT + bool _removed_monitors; +#endif public: @@ -78,7 +81,7 @@ class vframeArrayElement : public _ValueObj { StackValueCollection* expressions(void) const { return _expressions; } - void fill_in(compiledVFrame* vf); + void fill_in(compiledVFrame* vf, bool realloc_failures); // Formerly part of deoptimizedVFrame @@ -99,6 +102,12 @@ class vframeArrayElement : public _ValueObj { bool is_bottom_frame, int exec_mode); +#ifdef ASSERT + void set_removed_monitors() { + _removed_monitors = true; + } +#endif + #ifndef PRODUCT void print(outputStream* st); #endif /* PRODUCT */ @@ -160,13 +169,14 @@ class vframeArray: public CHeapObj { int frames() const { return _frames; } static vframeArray* allocate(JavaThread* thread, int frame_size, GrowableArray* chunk, - RegisterMap* reg_map, frame sender, frame caller, frame self); + RegisterMap* reg_map, frame sender, frame caller, frame self, + bool realloc_failures); vframeArrayElement* element(int index) { assert(is_within_bounds(index), "Bad index"); return &_elements[index]; } // Allocates a new vframe in the array and fills the array with vframe information in chunk - void fill_in(JavaThread* thread, int frame_size, GrowableArray* chunk, const RegisterMap *reg_map); + void fill_in(JavaThread* thread, int frame_size, GrowableArray* chunk, const RegisterMap *reg_map, bool realloc_failures); // Returns the owner of this vframeArray JavaThread* owner_thread() const { return _owner_thread; } diff --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp index 4df238925dd..327e0f0009c 100644 --- a/hotspot/src/share/vm/runtime/vmStructs.cpp +++ b/hotspot/src/share/vm/runtime/vmStructs.cpp @@ -556,9 +556,6 @@ typedef TwoOopHashtable SymbolTwoOopHashtable; \ nonstatic_field(TenuredGeneration, _min_heap_delta_bytes, size_t) \ nonstatic_field(TenuredGeneration, _the_space, ContiguousSpace*) \ - nonstatic_field(TenuredGeneration, _last_gc, WaterMark) \ - \ - \ \ nonstatic_field(Space, _bottom, HeapWord*) \ nonstatic_field(Space, _end, HeapWord*) \ diff --git a/hotspot/src/share/vm/trace/trace.xml b/hotspot/src/share/vm/trace/trace.xml index 120d27f4d4d..fc7acd38e95 100644 --- a/hotspot/src/share/vm/trace/trace.xml +++ b/hotspot/src/share/vm/trace/trace.xml @@ -314,6 +314,28 @@ Declares a structure type that can be used in other events. + + + + + + + + + + + + + + + + + + diff --git a/hotspot/test/compiler/dependencies/MonomorphicObjectCall/TestMonomorphicObjectCall.java b/hotspot/test/compiler/dependencies/MonomorphicObjectCall/TestMonomorphicObjectCall.java index 932599013cf..8884ce404c5 100644 --- a/hotspot/test/compiler/dependencies/MonomorphicObjectCall/TestMonomorphicObjectCall.java +++ b/hotspot/test/compiler/dependencies/MonomorphicObjectCall/TestMonomorphicObjectCall.java @@ -61,6 +61,7 @@ public class TestMonomorphicObjectCall { String[] vmOpts = new String[] { "-Xbootclasspath/p:" + testClasses, "-Xcomp", + "-XX:+IgnoreUnrecognizedVMOptions", "-XX:-VerifyDependencies", "-XX:CompileOnly=TestMonomorphicObjectCall::callFinalize", "-XX:CompileOnly=Object::finalizeObject", diff --git a/hotspot/test/compiler/exceptions/SumTest.java b/hotspot/test/compiler/exceptions/SumTest.java new file mode 100644 index 00000000000..d4555aa55aa --- /dev/null +++ b/hotspot/test/compiler/exceptions/SumTest.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact 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 8066900 + * @summary FP registers are not properly restored by C1 when handling exceptions + * @run main/othervm -Xbatch SumTest + * + */ +public class SumTest { + private static class Sum { + + double[] sums; + + /** + * Construct empty Sum + */ + public Sum() { + sums = new double[0]; + } + + /** + * Return the sum of all numbers added to this Sum + * + * @return the sum + */ + final public double getSum() { + double sum = 0; + for (final double s : sums) { + sum += s; + } + + return sum; + } + + /** + * Add a new number to this Sum + * + * @param a number to be added. + */ + final public void add(double a) { + try { + sums[sums.length] = -1; // Cause IndexOutOfBoundsException + } catch (final IndexOutOfBoundsException e) { + final double[] oldSums = sums; + sums = new double[oldSums.length + 1]; // Extend sums + System.arraycopy(oldSums, 0, sums, 0, oldSums.length); + sums[oldSums.length] = a; // Append a + } + } + } + + public static void main(String[] args) throws Exception { + final Sum sum = new Sum(); + for (int i = 1; i <= 10000; ++i) { + sum.add(1); + double ii = sum.getSum(); + if (i != ii) { + throw new Exception("Failure: computed = " + ii + ", expected = " + i); + } + } + } + +} + diff --git a/hotspot/test/compiler/rangechecks/TestRangeCheckSmearing.java b/hotspot/test/compiler/rangechecks/TestRangeCheckSmearing.java new file mode 100644 index 00000000000..204d276f293 --- /dev/null +++ b/hotspot/test/compiler/rangechecks/TestRangeCheckSmearing.java @@ -0,0 +1,436 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact 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 8066103 + * @summary C2's range check smearing allows out of bound array accesses + * @library /testlibrary /testlibrary/whitebox /compiler/whitebox /testlibrary/com/oracle/java/testlibrary + * @build TestRangeCheckSmearing + * @run main ClassFileInstaller sun.hotspot.WhiteBox + * @run main ClassFileInstaller com.oracle.java.testlibrary.Platform + * @run main/othervm -ea -Xmixed -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI + * -XX:-BackgroundCompilation -XX:-UseOnStackReplacement TestRangeCheckSmearing + * + */ + +import java.lang.annotation.*; +import java.lang.reflect.*; +import java.util.*; +import sun.hotspot.WhiteBox; +import sun.hotspot.code.NMethod; +import com.oracle.java.testlibrary.Platform; + +public class TestRangeCheckSmearing { + private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox(); + + @Retention(RetentionPolicy.RUNTIME) + @interface Args { int[] value(); } + + // first range check is i + max of all constants + @Args({0, 8}) + static int m1(int[] array, int i, boolean allaccesses) { + int res = 0; + res += array[i+9]; + if (allaccesses) { + res += array[i+8]; + res += array[i+7]; + res += array[i+6]; + res += array[i+5]; + res += array[i+4]; + res += array[i+3]; + res += array[i+2]; + res += array[i+1]; + } + return res; + } + + // first range check is i + min of all constants + @Args({0, -9}) + static int m2(int[] array, int i, boolean allaccesses) { + int res = 0; + res += array[i+1]; + if (allaccesses) { + res += array[i+2]; + res += array[i+3]; + res += array[i+4]; + res += array[i+5]; + res += array[i+6]; + res += array[i+7]; + res += array[i+8]; + res += array[i+9]; + } + return res; + } + + // first range check is not i + min/max of all constants + @Args({0, 8}) + static int m3(int[] array, int i, boolean allaccesses) { + int res = 0; + res += array[i+3]; + if (allaccesses) { + res += array[i+2]; + res += array[i+1]; + res += array[i+4]; + res += array[i+5]; + res += array[i+6]; + res += array[i+7]; + res += array[i+8]; + res += array[i+9]; + } + return res; + } + + @Args({0, -9}) + static int m4(int[] array, int i, boolean allaccesses) { + int res = 0; + res += array[i+3]; + if (allaccesses) { + res += array[i+4]; + res += array[i+1]; + res += array[i+2]; + res += array[i+5]; + res += array[i+6]; + res += array[i+7]; + res += array[i+8]; + res += array[i+9]; + } + return res; + } + + @Args({0, -3}) + static int m5(int[] array, int i, boolean allaccesses) { + int res = 0; + res += array[i+3]; + res += array[i+2]; + if (allaccesses) { + res += array[i+1]; + res += array[i+4]; + res += array[i+5]; + res += array[i+6]; + res += array[i+7]; + res += array[i+8]; + res += array[i+9]; + } + return res; + } + + @Args({0, 6}) + static int m6(int[] array, int i, boolean allaccesses) { + int res = 0; + res += array[i+3]; + res += array[i+4]; + if (allaccesses) { + res += array[i+2]; + res += array[i+1]; + res += array[i+5]; + res += array[i+6]; + res += array[i+7]; + res += array[i+8]; + res += array[i+9]; + } + return res; + } + + @Args({0, 6}) + static int m7(int[] array, int i, boolean allaccesses) { + int res = 0; + res += array[i+3]; + res += array[i+2]; + res += array[i+4]; + if (allaccesses) { + res += array[i+1]; + res += array[i+5]; + res += array[i+6]; + res += array[i+7]; + res += array[i+8]; + res += array[i+9]; + } + return res; + } + + @Args({0, -3}) + static int m8(int[] array, int i, boolean allaccesses) { + int res = 0; + res += array[i+3]; + res += array[i+4]; + res += array[i+2]; + if (allaccesses) { + res += array[i+1]; + res += array[i+5]; + res += array[i+6]; + res += array[i+7]; + res += array[i+8]; + res += array[i+9]; + } + return res; + } + + @Args({6, 15}) + static int m9(int[] array, int i, boolean allaccesses) { + int res = 0; + res += array[i+3]; + if (allaccesses) { + res += array[i-2]; + res += array[i-1]; + res += array[i-4]; + res += array[i-5]; + res += array[i-6]; + } + return res; + } + + @Args({3, 12}) + static int m10(int[] array, int i, boolean allaccesses) { + int res = 0; + res += array[i+3]; + if (allaccesses) { + res += array[i-2]; + res += array[i-1]; + res += array[i-3]; + res += array[i+4]; + res += array[i+5]; + res += array[i+6]; + } + return res; + } + + @Args({3, -3}) + static int m11(int[] array, int i, boolean allaccesses) { + int res = 0; + res += array[i+3]; + res += array[i-2]; + if (allaccesses) { + res += array[i+5]; + res += array[i+6]; + } + return res; + } + + @Args({3, 6}) + static int m12(int[] array, int i, boolean allaccesses) { + int res = 0; + res += array[i+3]; + res += array[i+6]; + if (allaccesses) { + res += array[i-2]; + res += array[i-3]; + } + return res; + } + + // check that identical range check is replaced by dominating one + // only when correct + @Args({0}) + static int m13(int[] array, int i, boolean ignore) { + int res = 0; + res += array[i+3]; + res += array[i+3]; + return res; + } + + @Args({2, 0}) + static int m14(int[] array, int i, boolean ignore) { + int res = 0; + + res += array[i]; + res += array[i-2]; + res += array[i]; // If range check below were to be removed first this cannot be considered identical to first range check + res += array[i-1]; // range check removed so i-1 array access depends on previous check + + return res; + } + + static int[] m15_dummy = new int[10]; + @Args({2, 0}) + static int m15(int[] array, int i, boolean ignore) { + int res = 0; + res += array[i]; + + // When the loop is optimized out we don't want the + // array[i-1] access which is dependent on array[i]'s + // range check to become dependent on the identical range + // check above. + + int[] array2 = m15_dummy; + int j = 0; + for (; j < 10; j++); + if (j == 10) { + array2 = array; + } + + res += array2[i-2]; + res += array2[i]; + res += array2[i-1]; // range check removed so i-1 array access depends on previous check + + return res; + } + + @Args({2, 0}) + static int m16(int[] array, int i, boolean ignore) { + int res = 0; + + res += array[i]; + res += array[i-1]; + res += array[i-1]; + res += array[i-2]; + + return res; + } + + @Args({2, 0}) + static int m17(int[] array, int i, boolean ignore) { + int res = 0; + + res += array[i]; + res += array[i-2]; + res += array[i-2]; + res += array[i+2]; + res += array[i+2]; + res += array[i-1]; + res += array[i-1]; + + return res; + } + + static public void main(String[] args) { + if (WHITE_BOX.getBooleanVMFlag("BackgroundCompilation")) { + throw new AssertionError("Background compilation enabled"); + } + new TestRangeCheckSmearing().doTests(); + } + boolean success = true; + boolean exception = false; + final int[] array = new int[10]; + final HashMap tests = new HashMap<>(); + { + final Class TEST_PARAM_TYPES[] = { int[].class, int.class, boolean.class }; + for (Method m : this.getClass().getDeclaredMethods()) { + if (m.getName().matches("m[0-9]+")) { + assert(Modifier.isStatic(m.getModifiers())) : m; + assert(m.getReturnType() == int.class) : m; + assert(Arrays.equals(m.getParameterTypes(), TEST_PARAM_TYPES)) : m; + tests.put(m.getName(), m); + } + } + } + + void invokeTest(Method m, int[] array, int index, boolean z) { + try { + m.invoke(null, array, index, z); + } catch (ReflectiveOperationException roe) { + Throwable ex = roe.getCause(); + if (ex instanceof ArrayIndexOutOfBoundsException) + throw (ArrayIndexOutOfBoundsException) ex; + throw new AssertionError(roe); + } + } + + void doTest(String name) { + Method m = tests.get(name); + tests.remove(name); + int[] args = m.getAnnotation(Args.class).value(); + int index0 = args[0], index1; + boolean exceptionRequired = true; + if (args.length == 2) { + index1 = args[1]; + } else { + // no negative test for this one + assert(args.length == 1); + assert(name.equals("m13")); + exceptionRequired = false; + index1 = index0; + } + // Get the method compiled. + if (!WHITE_BOX.isMethodCompiled(m)) { + // If not, try to compile it with C2 + if(!WHITE_BOX.enqueueMethodForCompilation(m, CompilerWhiteBoxTest.COMP_LEVEL_FULL_OPTIMIZATION)) { + // C2 compiler not available, try to compile with C1 + WHITE_BOX.enqueueMethodForCompilation(m, CompilerWhiteBoxTest.COMP_LEVEL_SIMPLE); + } + } + if (!WHITE_BOX.isMethodCompiled(m)) { + throw new RuntimeException(m + " not compiled"); + } + + // valid access + invokeTest(m, array, index0, true); + + if (!WHITE_BOX.isMethodCompiled(m)) { + throw new RuntimeException(m + " deoptimized on valid array access"); + } + + exception = false; + boolean test_success = true; + try { + invokeTest(m, array, index1, false); + } catch(ArrayIndexOutOfBoundsException aioob) { + exception = true; + System.out.println("ArrayIndexOutOfBoundsException thrown in "+name); + } + if (!exception) { + System.out.println("ArrayIndexOutOfBoundsException was not thrown in "+name); + } + + if (Platform.isServer()) { + if (exceptionRequired == WHITE_BOX.isMethodCompiled(m)) { + System.out.println((exceptionRequired?"Didn't deoptimized":"deoptimized") + " in "+name); + test_success = false; + } + } + + if (exception != exceptionRequired) { + System.out.println((exceptionRequired?"exception required but not thrown":"not exception required but thrown") + " in "+name); + test_success = false; + } + + if (!test_success) { + success = false; + System.out.println("TEST FAILED: "+name); + } + + } + void doTests() { + doTest("m1"); + doTest("m2"); + doTest("m3"); + doTest("m4"); + doTest("m5"); + doTest("m6"); + doTest("m7"); + doTest("m8"); + doTest("m9"); + doTest("m10"); + doTest("m11"); + doTest("m12"); + doTest("m13"); + doTest("m14"); + doTest("m15"); + doTest("m16"); + doTest("m17"); + if (!success) { + throw new RuntimeException("Some tests failed"); + } + assert(tests.isEmpty()) : tests; + } +} diff --git a/hotspot/test/compiler/rangechecks/TestRangeCheckSmearingLoopOpts.java b/hotspot/test/compiler/rangechecks/TestRangeCheckSmearingLoopOpts.java new file mode 100644 index 00000000000..699754a8e8c --- /dev/null +++ b/hotspot/test/compiler/rangechecks/TestRangeCheckSmearingLoopOpts.java @@ -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 8048170 + * @summary Following range check smearing, range check cannot be replaced by dominating identical test. + * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement TestRangeCheckSmearingLoopOpts + * + */ +public class TestRangeCheckSmearingLoopOpts { + + static int dummy; + + static int m1(int[] array, int i) { + for (;;) { + for (;;) { + if (array[i] < 0) { // range check (i+0) dominates equivalent check below + break; + } + i++; + } + + // A control flow that stops IfNode::up_one_dom() + if ((i % 2)== 0) { + if ((array[i] % 2) == 0) { + dummy = i; + } + } + + // IfNode::Ideal will rewrite some range checks if Compile::allow_range_check_smearing + if (array[i-1] == 9) { // range check (i-1) unchanged + int res = array[i-3]; // range check (i-3) unchanged + res += array[i]; // range check (i+0) unchanged + res += array[i-2]; // removed redundant range check + // the previous access might be hoisted by + // PhaseIdealLoop::split_if_with_blocks_post because + // it appears to have the same guard, but it also + // depends on the previous guards + return res; + } + i++; + } + } + + static public void main(String[] args) { + int[] array = { 0, 1, 2, -3, 4, 5, -2, 7, 8, 9, -1 }; + for (int i = 0; i < 20000; i++) { + m1(array, 0); + } + array[0] = -1; + try { + m1(array, 0); + } catch(ArrayIndexOutOfBoundsException aioobe) {} + } +} diff --git a/hotspot/test/compiler/uncommontrap/TestDeoptOOM.java b/hotspot/test/compiler/uncommontrap/TestDeoptOOM.java new file mode 100644 index 00000000000..5342582fb00 --- /dev/null +++ b/hotspot/test/compiler/uncommontrap/TestDeoptOOM.java @@ -0,0 +1,426 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact 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 6898462 + * @summary failed reallocations of scalar replaced objects during deoptimization causes crash + * @run main/othervm -XX:-BackgroundCompilation -XX:CompileCommand=exclude,TestDeoptOOM::main -XX:CompileCommand=exclude,TestDeoptOOM::m9_1 -Xmx128M TestDeoptOOM + * + */ + +public class TestDeoptOOM { + + long f1; + long f2; + long f3; + long f4; + long f5; + + static class LinkedList { + LinkedList l; + long[] array; + LinkedList(LinkedList l, int size) { + array = new long[size]; + this.l = l; + } + } + + static LinkedList ll; + + static void consume_all_memory() { + int size = 128 * 1024 * 1024; + while(size > 0) { + try { + while(true) { + ll = new LinkedList(ll, size); + } + } catch(OutOfMemoryError oom) { + } + size = size / 2; + } + } + + static void free_memory() { + ll = null; + } + + static TestDeoptOOM m1(boolean deopt) { + try { + TestDeoptOOM tdoom = new TestDeoptOOM(); + if (deopt) { + return tdoom; + } + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in m1"); + } + return null; + } + + static TestDeoptOOM m2_1(boolean deopt) { + try { + TestDeoptOOM tdoom = new TestDeoptOOM(); + if (deopt) { + return tdoom; + } + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in m2_1"); + } + return null; + } + + static TestDeoptOOM m2(boolean deopt) { + try { + return m2_1(deopt); + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in m2"); + } + return null; + } + + static TestDeoptOOM m3_3(boolean deopt) { + try { + TestDeoptOOM tdoom = new TestDeoptOOM(); + if (deopt) { + return tdoom; + } + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in m3_3"); + } + return null; + } + + static boolean m3_2(boolean deopt) { + try { + return m3_3(deopt) != null; + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in m3_2"); + } + return false; + } + + static TestDeoptOOM m3_1(boolean deopt) { + try { + TestDeoptOOM tdoom = new TestDeoptOOM(); + if (m3_2(deopt)) { + return tdoom; + } + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in m3_1"); + } + return null; + } + + static TestDeoptOOM m3(boolean deopt) { + try { + return m3_1(deopt); + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in m3"); + } + return null; + } + + static TestDeoptOOM m4(boolean deopt) { + try { + TestDeoptOOM tdoom = new TestDeoptOOM(); + if (deopt) { + tdoom.f1 = 1l; + tdoom.f2 = 2l; + tdoom.f3 = 3l; + return tdoom; + } + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in m4"); + } + return null; + } + + static TestDeoptOOM m5(boolean deopt) { + try { + TestDeoptOOM tdoom = new TestDeoptOOM(); + synchronized(tdoom) { + if (deopt) { + return tdoom; + } + } + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in m5"); + } + return null; + } + + synchronized TestDeoptOOM m6_1(boolean deopt) { + if (deopt) { + return this; + } + return null; + } + + static TestDeoptOOM m6(boolean deopt) { + try { + TestDeoptOOM tdoom = new TestDeoptOOM(); + return tdoom.m6_1(deopt); + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in m6"); + } + return null; + } + + static TestDeoptOOM m7_1(boolean deopt, Object lock) { + try { + synchronized(lock) { + TestDeoptOOM tdoom = new TestDeoptOOM(); + if (deopt) { + return tdoom; + } + } + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in m7_1"); + } + return null; + } + + static TestDeoptOOM m7(boolean deopt, Object lock) { + try { + return m7_1(deopt, lock); + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in m7"); + } + return null; + } + + static class A { + long f1; + long f2; + long f3; + long f4; + long f5; + } + + static class B { + long f1; + long f2; + long f3; + long f4; + long f5; + + A a; + } + + static B m8(boolean deopt) { + try { + A a = new A(); + B b = new B(); + b.a = a; + if (deopt) { + return b; + } + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in m8"); + } + return null; + } + + static void m9_1(int i) { + if (i > 90000) { + consume_all_memory(); + } + } + + static TestDeoptOOM m9() { + try { + for (int i = 0; i < 100000; i++) { + TestDeoptOOM tdoom = new TestDeoptOOM(); + m9_1(i); + if (i > 90000) { + return tdoom; + } + } + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in m1"); + } + return null; + } + + public static void main(String[] args) { + for (int i = 0; i < 20000; i++) { + m1(false); + } + + consume_all_memory(); + + try { + m1(true); + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in main " + oom.getMessage()); + } + + free_memory(); + + for (int i = 0; i < 20000; i++) { + m2(false); + } + + consume_all_memory(); + + try { + m2(true); + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in main"); + } + + free_memory(); + + for (int i = 0; i < 20000; i++) { + m3(false); + } + + consume_all_memory(); + + try { + m3(true); + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in main"); + } + + free_memory(); + + for (int i = 0; i < 20000; i++) { + m4(false); + } + + consume_all_memory(); + + try { + m4(true); + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in main"); + } + + free_memory(); + + for (int i = 0; i < 20000; i++) { + m5(false); + } + + consume_all_memory(); + + try { + m5(true); + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in main"); + } + + free_memory(); + + for (int i = 0; i < 20000; i++) { + m6(false); + } + + consume_all_memory(); + + try { + m6(true); + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in main"); + } + + free_memory(); + + final Object lock = new Object(); + + for (int i = 0; i < 20000; i++) { + m7(false, lock); + } + + consume_all_memory(); + + try { + m7(true, lock); + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in main"); + } + + free_memory(); + + Thread thread = new Thread() { + public void run() { + System.out.println("Acquiring lock"); + synchronized(lock) { + System.out.println("Lock acquired"); + } + System.out.println("Lock released"); + } + }; + thread.start(); + try { + thread.join(); + } catch(InterruptedException ie) { + } + + for (int i = 0; i < 20000; i++) { + m8(false); + } + + consume_all_memory(); + + try { + m8(true); + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in main"); + } + + free_memory(); + + try { + m9(); + } catch(OutOfMemoryError oom) { + free_memory(); + System.out.println("OOM caught in main"); + } + + free_memory(); + } +} diff --git a/hotspot/test/compiler/uncommontrap/TraceDeoptimizationNoRealloc.java b/hotspot/test/compiler/uncommontrap/TraceDeoptimizationNoRealloc.java new file mode 100644 index 00000000000..563bbbbe00e --- /dev/null +++ b/hotspot/test/compiler/uncommontrap/TraceDeoptimizationNoRealloc.java @@ -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 8067144 + * @summary -XX:+TraceDeoptimization tries to print realloc'ed objects even when there are none + * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:+IgnoreUnrecognizedVMOptions -XX:+TraceDeoptimization TraceDeoptimizationNoRealloc + * + */ + +public class TraceDeoptimizationNoRealloc { + + static void m(boolean some_condition) { + if (some_condition) { + return; + } + } + + + static public void main(String[] args) { + for (int i = 0; i < 20000; i++) { + m(false); + } + m(true); + } +} diff --git a/hotspot/test/gc/TestCardTablePageCommits.java b/hotspot/test/gc/TestCardTablePageCommits.java new file mode 100644 index 00000000000..0dec3d83b93 --- /dev/null +++ b/hotspot/test/gc/TestCardTablePageCommits.java @@ -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 com.oracle.java.testlibrary.JDKToolFinder; +import com.oracle.java.testlibrary.OutputAnalyzer; +import com.oracle.java.testlibrary.ProcessTools; +import com.oracle.java.testlibrary.Platform; + +/* + * @test TestCardTablePageCommits + * @key gc + * @bug 8059066 + * @summary Tests that the card table does not commit the same page twice + * @library /testlibrary + * @run driver TestCardTablePageCommits + */ +public class TestCardTablePageCommits { + public static void main(String args[]) throws Exception { + // The test is run with a small heap to make sure all pages in the card + // table gets committed. Need 8 MB heap to trigger the bug on SPARC + // because of 8kB pages, assume 4 KB pages for all other CPUs. + String Xmx = Platform.isSparc() ? "-Xmx8m" : "-Xmx4m"; + + String[] opts = {Xmx, "-XX:NativeMemoryTracking=detail", "-XX:+UseParallelGC", "-version"}; + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(opts); + OutputAnalyzer output = new OutputAnalyzer(pb.start()); + output.shouldHaveExitValue(0); + } +} diff --git a/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java b/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java index b002a983fcd..6dc41e5e45d 100644 --- a/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java +++ b/hotspot/test/testlibrary/whitebox/sun/hotspot/WhiteBox.java @@ -153,6 +153,14 @@ public class WhiteBox { public native int getMethodEntryBci(Executable method); public native Object[] getNMethod(Executable method, boolean isOsr); public native long allocateCodeBlob(int size, int type); + public long allocateCodeBlob(long size, int type) { + int intSize = (int) size; + if ((long) intSize != size || size < 0) { + throw new IllegalArgumentException( + "size argument has illegal value " + size); + } + return allocateCodeBlob( intSize, type); + } public native void freeCodeBlob(long addr); public void forceNMethodSweep() { try { diff --git a/jaxp/.hgtags b/jaxp/.hgtags index c9d9de60c63..87019760616 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -284,3 +284,4 @@ b9370464572fc663a38956047aa612d6e7854c3d jdk9-b35 a12d347f84176200593999f4da91ae2bb86865b2 jdk9-b39 3f46e2196498de33e7c65efa7b372e46f1faba01 jdk9-b40 71dd8f7649428efd3a56ca5fefc80e59d37b8434 jdk9-b41 +47b0d3fa4118b9d56870cf4004987438c501f5c0 jdk9-b42 diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DBFNamespaceTest.java b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DBFNamespaceTest.java new file mode 100644 index 00000000000..930ef818341 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DBFNamespaceTest.java @@ -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 javax.xml.parsers.ptests; + +import static jaxp.library.JAXPTestUtilities.FILE_SEP; +import static jaxp.library.JAXPTestUtilities.USER_DIR; +import static jaxp.library.JAXPTestUtilities.compareWithGold; +import static jaxp.library.JAXPTestUtilities.failUnexpected; +import static org.testng.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.TransformerFactoryConfigurationError; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXResult; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +/** + * This tests DocumentBuilderFactory for namespace processing and no-namespace + * processing. + */ +public class DBFNamespaceTest { + + /** + * Provide input for the cases that supporting namespace or not. + */ + @DataProvider(name = "input-provider") + public Object[][] getInput() { + DocumentBuilderFactory dbf1 = DocumentBuilderFactory.newInstance(); + String outputfile1 = USER_DIR + FILE_SEP + "dbfnstest01.out"; + String goldfile1 = TestUtils.GOLDEN_DIR + FILE_SEP + "dbfnstest01GF.out"; + + DocumentBuilderFactory dbf2 = DocumentBuilderFactory.newInstance(); + dbf2.setNamespaceAware(true); + String outputfile2 = USER_DIR + FILE_SEP + "dbfnstest02.out"; + String goldfile2 = TestUtils.GOLDEN_DIR + FILE_SEP + "dbfnstest02GF.out"; + return new Object[][] { { dbf1, outputfile1, goldfile1 }, { dbf2, outputfile2, goldfile2 } }; + } + + /** + * Test to parse and transform a document without supporting namespace and + * with supporting namespace. + */ + @Test(dataProvider = "input-provider") + public void testNamespaceTest(DocumentBuilderFactory dbf, String outputfile, String goldfile) { + try { + Document doc = dbf.newDocumentBuilder().parse(new File(TestUtils.XML_DIR, "namespace1.xml")); + dummyTransform(doc, outputfile); + assertTrue(compareWithGold(goldfile, outputfile)); + } catch (SAXException | IOException | ParserConfigurationException | TransformerFactoryConfigurationError | TransformerException e) { + failUnexpected(e); + } + } + + /** + * This method transforms a Node without any xsl file and uses SAXResult to + * invoke the callbacks through a ContentHandler. If namespace processing is + * not chosen, namespaceURI in callbacks should be an empty string otherwise + * it should be namespaceURI. + * + * @throws TransformerFactoryConfigurationError + * @throws TransformerException + * @throws IOException + */ + private void dummyTransform(Document document, String fileName) throws TransformerFactoryConfigurationError, TransformerException, IOException { + DOMSource domSource = new DOMSource(document); + Transformer transformer = TransformerFactory.newInstance().newTransformer(); + File file = new File(fileName); + System.out.println("The fileName is " + file.getAbsolutePath()); + transformer.transform(domSource, new SAXResult(MyCHandler.newInstance(file))); + } + +} diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderFactory01.java b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderFactory01.java new file mode 100644 index 00000000000..fddfaaa89b1 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderFactory01.java @@ -0,0 +1,451 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please 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.xml.parsers.ptests; + +import static jaxp.library.JAXPTestUtilities.FILE_SEP; +import static jaxp.library.JAXPTestUtilities.failUnexpected; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileReader; +import java.io.IOException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.testng.annotations.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * This checks the methods of DocumentBuilderFactoryImpl + */ +public class DocumentBuilderFactory01 { + /** + * Testcase to test the default functionality of schema support method. + */ + @Test + public void testCheckSchemaSupport1() { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setValidating(true); + dbf.setNamespaceAware(true); + dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); + MyErrorHandler eh = MyErrorHandler.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + db.setErrorHandler(eh); + Document doc = db.parse(new File(TestUtils.XML_DIR, "test.xml")); + assertFalse(eh.errorOccured); + } catch (ParserConfigurationException | SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the default functionality of schema support method. In + * this case the schema source property is set. + */ + @Test + public void testCheckSchemaSupport2() { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setValidating(true); + dbf.setNamespaceAware(true); + dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); + dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", new InputSource(new FileInputStream( + new File(TestUtils.XML_DIR, "test.xsd")))); + MyErrorHandler eh = MyErrorHandler.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + db.setErrorHandler(eh); + Document doc = db.parse(new File(TestUtils.XML_DIR, "test1.xml")); + assertFalse(eh.errorOccured); + } catch (IllegalArgumentException | ParserConfigurationException | SAXException | IOException e) { + failUnexpected(e); + } + + } + + /** + * Testcase to test the default functionality of schema support method. In + * this case the schema source property is set. + */ + @Test + public void testCheckSchemaSupport3() { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setNamespaceAware(true); + spf.setValidating(true); + spf.setNamespaceAware(true); + SAXParser sp = spf.newSAXParser(); + sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); + sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", + new InputSource(new FileInputStream(new File(TestUtils.XML_DIR, "test.xsd")))); + DefaultHandler dh = new DefaultHandler(); + sp.parse(new File(TestUtils.XML_DIR, "test1.xml"), dh); + } catch (ParserConfigurationException | SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the default functionality of newInstance method. To test + * the isCoalescing method and setCoalescing This checks to see if the CDATA + * and text nodes got combined In that case it will print "<xml>This + * is not parsed</xml> yet". + */ + @Test + public void testCheckDocumentBuilderFactory02() { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setCoalescing(true); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + Document doc = docBuilder.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory01.xml")); + Element e = (Element) doc.getElementsByTagName("html").item(0); + NodeList nl = e.getChildNodes(); + assertEquals(nl.item(0).getNodeValue().trim(), "This is not parsed yet"); + } catch (IOException | SAXException | ParserConfigurationException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the isIgnoringComments. By default it is false. + */ + @Test + public void testCheckDocumentBuilderFactory03() { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + assertFalse(dbf.isIgnoringComments()); + } + + /** + * Testcase to test the isValidating. By default it is false, set it to true + * and then use a document which is not valid. It should throw a warning or + * an error at least. The test passes in case retval 0 is set in the error + * method . + */ + @Test + public void testCheckDocumentBuilderFactory04() { + try { + MyErrorHandler eh = MyErrorHandler.newInstance(); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setValidating(true); + DocumentBuilder db = dbf.newDocumentBuilder(); + db.setErrorHandler(eh); + Document doc = db.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory05.xml")); + assertTrue(eh.errorOccured); + } catch (ParserConfigurationException | IOException | SAXException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the setValidating. By default it is false, use a + * document which is not valid. It should not throw a warning or an error. + * The test passes in case the retval equals 1 . + */ + @Test + public void testCheckDocumentBuilderFactory16() { + try { + MyErrorHandler eh = MyErrorHandler.newInstance(); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + db.setErrorHandler(eh); + Document doc = db.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory05.xml")); + assertFalse(eh.errorOccured); + } catch (ParserConfigurationException | IOException | SAXException e) { + failUnexpected(e); + } + + } + + /** + * Testcase to test the setValidating. By default it is false, use a + * document which is valid. It should not throw a warning or an error. The + * test passes in case the retval equals 1. + */ + @Test + public void testCheckDocumentBuilderFactory17() { + try { + MyErrorHandler eh = MyErrorHandler.newInstance(); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + db.setErrorHandler(eh); + Document doc = db.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory04.xml")); + assertFalse(eh.errorOccured); + } catch (ParserConfigurationException | IOException | SAXException e) { + failUnexpected(e); + } + + } + + /** + * To test the isExpandEntityReferences. By default it is true. + */ + @Test + public void testCheckDocumentBuilderFactory05() { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory02.xml"))); + Element e = (Element) doc.getElementsByTagName("title").item(0); + NodeList nl = e.getChildNodes(); + assertTrue(dbf.isExpandEntityReferences()); + assertEquals(nl.item(0).getNodeValue().trim().charAt(0), 'W'); + } catch (ParserConfigurationException | IOException | SAXException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the default functionality of setValidating method. The + * xml file has a DTD which has namespaces defined. The parser takes care to + * check if the namespaces using elements and defined attributes are there + * or not. + */ + @Test + public void testCheckDocumentBuilderFactory06() { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setValidating(true); + DocumentBuilder db = dbf.newDocumentBuilder(); + MyErrorHandler eh = MyErrorHandler.newInstance(); + db.setErrorHandler(eh); + Document doc = db.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory04.xml")); + assertTrue(doc instanceof Document); + assertFalse(eh.errorOccured); + } catch (ParserConfigurationException | IOException | SAXException e) { + failUnexpected(e); + } + + } + + /** + * Testcase to test the setExpandEntityReferences. + */ + @Test + public void testCheckDocumentBuilderFactory07() { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setExpandEntityReferences(true); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory02.xml"))); + Element e = (Element) doc.getElementsByTagName("title").item(0); + NodeList nl = e.getChildNodes(); + assertTrue(dbf.isExpandEntityReferences()); + assertEquals(nl.item(0).getNodeValue().trim().charAt(0), 'W'); + } catch (ParserConfigurationException | IOException | SAXException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the setExpandEntityReferences. + */ + @Test + public void testCheckDocumentBuilderFactory08() { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setExpandEntityReferences(false); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory02.xml"))); + Element e = (Element) doc.getElementsByTagName("title").item(0); + NodeList nl = e.getChildNodes(); + assertNull(nl.item(0).getNodeValue()); + } catch (ParserConfigurationException | IOException | SAXException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the setIgnoringComments. By default it is set to false. + * explicitly setting it to false, it recognizes the comment which is in + * Element Node Hence the Element's child node is not null. + */ + @Test + public void testCheckDocumentBuilderFactory09() { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setIgnoringComments(false); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory07.xml"))); + Element e = (Element) doc.getElementsByTagName("body").item(0); + NodeList nl = e.getChildNodes(); + assertNotNull(nl.item(0).getNodeValue()); + } catch (ParserConfigurationException | IOException | SAXException e) { + failUnexpected(e); + } + + } + + /** + * This tests for the parse(InputSource). + */ + @Test + public void testCheckDocumentBuilderFactory10() { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + Document doc = docBuilder.parse(new InputSource(new BufferedReader(new FileReader(new File(TestUtils.XML_DIR, "DocumentBuilderFactory07.xml"))))); + assertTrue(doc instanceof Document); + } catch (IllegalArgumentException | ParserConfigurationException | IOException | SAXException e) { + failUnexpected(e); + } + } + + /** + * This tests for the parse InputStream with SystemID as a second parameter. + */ + @Test + public void testCheckDocumentBuilderFactory11() { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "dbf10import.xsl")), new File(TestUtils.XML_DIR).toURI() + .toASCIIString()); + assertTrue(doc instanceof Document); + } catch (IllegalArgumentException | ParserConfigurationException | IOException | SAXException e) { + failUnexpected(e); + } + } + + /** + * This tests for the parse InputStream with empty SystemID as a second + * parameter. + */ + @Test + public void testCheckDocumentBuilderFactory12() { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "dbf10import.xsl")), " "); + assertTrue(doc instanceof Document); + } catch (IllegalArgumentException | ParserConfigurationException | IOException | SAXException e) { + failUnexpected(e); + } + } + + /** + * This tests for the parse(uri). + */ + @Test + public void testCheckDocumentBuilderFactory13() { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + Document doc = docBuilder.parse(new File(TestUtils.XML_DIR + FILE_SEP + "dbf10import.xsl").toURI().toASCIIString()); + assertTrue(doc instanceof Document); + } catch (IllegalArgumentException | ParserConfigurationException | IOException | SAXException e) { + failUnexpected(e); + } + } + + /** + * This tests for the parse (uri) with empty string as parameter should + * throw Sax Exception. + * + * @throws SAXException + * If any parse errors occur. + */ + @Test(expectedExceptions = SAXException.class) + public void testCheckDocumentBuilderFactory14() throws SAXException { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + docBuilder.parse(""); + } catch (ParserConfigurationException | IOException e) { + failUnexpected(e); + } + } + + /** + * This tests for the parse (uri) with null uri as parameter should throw + * IllegalArgumentException. + * + */ + @Test(expectedExceptions = IllegalArgumentException.class) + public void testCheckDocumentBuilderFactory15() { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + String uri = null; + docBuilder.parse(uri); + } catch (ParserConfigurationException | SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the setIgnoringComments. By default it is set to false, + * setting this to true, It does not recognize the comment, Here the + * nodelist has a length 0 because the ignoring comments is true. + */ + @Test + public void testCheckIgnoringComments() { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setIgnoringComments(true); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory08.xml"))); + Element e = (Element) doc.getElementsByTagName("body").item(0); + NodeList nl = e.getChildNodes(); + assertEquals(nl.getLength(), 0); + } catch (ParserConfigurationException | SAXException | IOException e) { + failUnexpected(e); + } + + } + + /** + * Testcase to test the default behaviour of setIgnoringComments. By default + * it is set to false, this is similar to case 9 but not setIgnoringComments + * explicitly, it does not recognize the comment. + */ + @Test + public void testCheckIgnoringComments1() { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderFactory07.xml"))); + Element e = (Element) doc.getElementsByTagName("body").item(0); + NodeList nl = e.getChildNodes(); + assertFalse(dbf.isIgnoringComments()); + assertNotNull(nl.item(0).getNodeValue()); + } catch (ParserConfigurationException | SAXException | IOException e) { + failUnexpected(e); + } + } +} diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderFactory02.java b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderFactory02.java new file mode 100644 index 00000000000..68722085ba2 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderFactory02.java @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package javax.xml.parsers.ptests; + +import static jaxp.library.JAXPTestUtilities.FILE_SEP; +import static jaxp.library.JAXPTestUtilities.USER_DIR; +import static jaxp.library.JAXPTestUtilities.compareWithGold; +import static jaxp.library.JAXPTestUtilities.failUnexpected; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.sax.SAXResult; + +import org.testng.annotations.Test; +import org.w3c.dom.Document; +import org.xml.sax.SAXException; + +/** + * This tests the setIgnoringElementWhitespace and setIgnoringComments of + * DocumentBuilderFactory + */ +public class DocumentBuilderFactory02 { + + /** + * This testcase tests for the isIgnoringElementContentWhitespace and the + * setIgnoringElementContentWhitespace. The xml file has all kinds of + * whitespace,tab and newline characters, it uses the MyNSContentHandler + * which does not invoke the characters callback when this + * setIgnoringElementContentWhitespace is set to true. + */ + @Test + public void testCheckElementContentWhitespace() { + try { + String goldFile = TestUtils.GOLDEN_DIR + FILE_SEP + "dbfactory02GF.out"; + String outputFile = USER_DIR + FILE_SEP + "dbfactory02.out"; + MyErrorHandler eh = MyErrorHandler.newInstance(); + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setValidating(true); + assertFalse(dbf.isIgnoringElementContentWhitespace()); + dbf.setIgnoringElementContentWhitespace(true); + DocumentBuilder db = dbf.newDocumentBuilder(); + db.setErrorHandler(eh); + Document doc = db.parse(new File(TestUtils.XML_DIR, "DocumentBuilderFactory06.xml")); + assertFalse(eh.errorOccured); + DOMSource domSource = new DOMSource(doc); + TransformerFactory tfactory = TransformerFactory.newInstance(); + Transformer transformer = tfactory.newTransformer(); + SAXResult saxResult = new SAXResult(); + saxResult.setHandler(MyCHandler.newInstance(new File(outputFile))); + transformer.transform(domSource, saxResult); + assertTrue(compareWithGold(goldFile, outputFile)); + } catch (ParserConfigurationException | SAXException | IOException | TransformerException e) { + failUnexpected(e); + } + } +} diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderImpl01.java b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderImpl01.java new file mode 100644 index 00000000000..d565748c37a --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderImpl01.java @@ -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. + */ + +package javax.xml.parsers.ptests; + +import static jaxp.library.JAXPTestUtilities.FILE_SEP; +import static jaxp.library.JAXPTestUtilities.failUnexpected; +import static org.testng.Assert.assertFalse; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.w3c.dom.Document; +import org.xml.sax.EntityResolver; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; + +/** + * This checks for the methods of DocumentBuilder + */ +public class DocumentBuilderImpl01 implements EntityResolver { + + /** + * Provide DocumentBuilder. + * + * @throws ParserConfigurationException + */ + @DataProvider(name = "builder-provider") + public Object[][] getBuilder() throws ParserConfigurationException { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = dbf.newDocumentBuilder(); + return new Object[][] { { docBuilder } }; + } + + /** + * Testcase to test the default functionality of isValidation method. Expect + * to return false because not setting the validation. + */ + @Test(dataProvider = "builder-provider") + public void testCheckDocumentBuilderImpl01(DocumentBuilder docBuilder) { + assertFalse(docBuilder.isValidating()); + + } + + /** + * Testcase to test the default functionality of isNamespaceAware method. + */ + @Test(dataProvider = "builder-provider") + public void testCheckDocumentBuilderImpl02(DocumentBuilder docBuilder) { + assertFalse(docBuilder.isNamespaceAware()); + } + + /** + * Testcase to test the parse(InputStream). + */ + @Test(dataProvider = "builder-provider") + public void testCheckDocumentBuilderImpl04(DocumentBuilder docBuilder) { + try { + Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderImpl01.xml"))); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the parse(File). + */ + @Test(dataProvider = "builder-provider") + public void testCheckDocumentBuilderImpl05(DocumentBuilder docBuilder) { + try { + Document doc = docBuilder.parse(new File(TestUtils.XML_DIR, "DocumentBuilderImpl01.xml")); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the parse(InputStream,systemId). + */ + @Test(dataProvider = "builder-provider") + public void testCheckDocumentBuilderImpl06(DocumentBuilder docBuilder) { + try { + Document doc = docBuilder.parse(new FileInputStream(new File(TestUtils.XML_DIR, "DocumentBuilderImpl02.xml")), new File(TestUtils.XML_DIR).toURI() + .toASCIIString() + FILE_SEP); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the setEntityResolver. + */ + @Test(dataProvider = "builder-provider") + public void testCheckDocumentBuilderImpl07(DocumentBuilder docBuilder) { + docBuilder.setEntityResolver(this); + resolveEntity("publicId", "http://www.myhost.com/today"); + } + + public InputSource resolveEntity(String publicId, String systemId) { + if (systemId.equals("http://www.myhost.com/today")) + return new InputSource(systemId); + else + return null; + } +} diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/FactoryConfErrorTest.java b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/FactoryConfErrorTest.java new file mode 100644 index 00000000000..947d6d8dd7d --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/FactoryConfErrorTest.java @@ -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 javax.xml.parsers.ptests; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.FactoryConfigurationError; +import javax.xml.parsers.SAXParserFactory; + +import org.testng.annotations.AfterTest; +import org.testng.annotations.BeforeTest; +import org.testng.annotations.Test; + +/** + * Class containing the test cases for SAXParserFactory/DocumentBuilderFactory + * newInstance methods. + */ +public class FactoryConfErrorTest { + + /** + * Set properties DocumentBuilderFactory and SAXParserFactory to invalid + * value before any test run. + */ + @BeforeTest + public void setup() { + System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "xx"); + System.setProperty("javax.xml.parsers.SAXParserFactory", "xx"); + } + + /** + * Restore properties DocumentBuilderFactory and SAXParserFactory to default + * value after all tests run. + */ + @AfterTest + public void cleanup() { + System.clearProperty("javax.xml.parsers.DocumentBuilderFactory"); + System.clearProperty("javax.xml.parsers.SAXParserFactory"); + } + + /** + * To test exception thrown if javax.xml.parsers.SAXParserFactory property + * is invalid. + */ + @Test(expectedExceptions = FactoryConfigurationError.class) + public void testNewInstance01() { + SAXParserFactory.newInstance(); + } + + /** + * To test exeception thrown if javax.xml.parsers.DocumentBuilderFactory is + * invalid. + */ + @Test(expectedExceptions = FactoryConfigurationError.class) + public void testNewInstance02() { + DocumentBuilderFactory.newInstance(); + } +} diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserFactTest.java b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserFactTest.java new file mode 100644 index 00000000000..da87e006f58 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserFactTest.java @@ -0,0 +1,268 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please 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.xml.parsers.ptests; + +import static jaxp.library.JAXPTestUtilities.failUnexpected; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.testng.annotations.Test; +import org.xml.sax.SAXException; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; + +/** + * Class containing the test cases for SAXParserFactory API + */ +public class SAXParserFactTest { + + private static final String NAMESPACES = "http://xml.org/sax/features/namespaces"; + private static final String NAMESPACE_PREFIXES = "http://xml.org/sax/features/namespace-prefixes"; + private static final String STRING_INTERNING = "http://xml.org/sax/features/string-interning"; + private static final String VALIDATION = "http://xml.org/sax/features/validation"; + private static final String EXTERNAL_G_ENTITIES = "http://xml.org/sax/features/external-general-entities"; + private static final String EXTERNAL_P_ENTITIES = "http://xml.org/sax/features/external-parameter-entities"; + + /** + * Testcase to test if newSAXParser() method returns SAXParser. + */ + @Test + public void testParser01() { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + SAXParser saxparser = spf.newSAXParser(); + } catch (ParserConfigurationException | SAXException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the default functionality (No validation) of the parser. + */ + @Test + public void testValidate01() { + SAXParserFactory spf = SAXParserFactory.newInstance(); + assertFalse(spf.isValidating()); + } + + /** + * Testcase to test the functionality of setValidating and isvalidating + * methods. + */ + @Test + public void testValidate02() { + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setValidating(true); + assertTrue(spf.isValidating()); + } + + /** + * Parser should not be namespaceaware by default. + */ + @Test + public void testNamespace01() { + SAXParserFactory spf = SAXParserFactory.newInstance(); + assertFalse(spf.isNamespaceAware()); + } + + /** + * Testcase to test the functionality of setNamespaceAware and + * isNamespaceAware methods. + */ + @Test + public void testNamespace02() { + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setNamespaceAware(true); + assertTrue(spf.isNamespaceAware()); + } + + /** + * Testcase to test the functionality of setNamespaceAware and getFeature() + * methods for namespaces property. + */ + @Test + public void testFeature01() { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + assertFalse(spf.getFeature(NAMESPACES)); + + spf.setNamespaceAware(true); + assertTrue(spf.getFeature(NAMESPACES)); + } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the functionality of setFeature and getFeature methods + * for namespaces property. + */ + @Test + public void testFeature02() { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + + spf.setFeature(NAMESPACES, true); + assertTrue(spf.getFeature(NAMESPACES)); + + spf.setFeature(NAMESPACES, false); + assertFalse(spf.getFeature(NAMESPACES)); + } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the functionality of setFeature and getFeature methods + * for namespace-prefixes property. + */ + @Test + public void testFeature03() { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + + spf.setFeature(NAMESPACE_PREFIXES, true); + assertTrue(spf.getFeature(NAMESPACE_PREFIXES)); + + spf.setFeature(NAMESPACE_PREFIXES, false); + assertFalse(spf.getFeature(NAMESPACE_PREFIXES)); + } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the functionality of getFeature method for + * string-interning property. + */ + @Test + public void testFeature04() { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + assertTrue(spf.getFeature(STRING_INTERNING)); + } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the functionality of getFeature and setValidating + * methods for validation property. + */ + @Test + public void testFeature05() { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + assertFalse(spf.getFeature(VALIDATION)); + spf.setValidating(true); + assertTrue(spf.getFeature(VALIDATION)); + } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) { + failUnexpected(e); + } + + } + + /** + * Testcase to test the functionality of setFeature and getFeature methods + * for validation property. + */ + @Test + public void testFeature06() { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + + spf.setFeature(VALIDATION, true); + assertTrue(spf.getFeature(VALIDATION)); + + spf.setFeature(VALIDATION, false); + assertFalse(spf.getFeature(VALIDATION)); + } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) { + failUnexpected(e); + } + + } + + /** + * Testcase to test the functionality of getFeature method for + * external-general-entities property. + */ + @Test + public void testFeature07() { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + assertTrue(spf.getFeature(EXTERNAL_G_ENTITIES)); + } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) { + failUnexpected(e); + } + + } + + /** + * Testcase to test the functionality of setFeature and getFeature methods + * for external-general-entities property. + */ + @Test + public void testFeature08() { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setFeature(EXTERNAL_G_ENTITIES, false); + assertFalse(spf.getFeature(EXTERNAL_G_ENTITIES)); + } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the functionality of getFeature method for + * external-parameter-entities property. + */ + @Test + public void testFeature09() { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + assertTrue(spf.getFeature(EXTERNAL_P_ENTITIES)); + } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) { + failUnexpected(e); + } + } + + /** + * Testcase to test the functionality of setFeature method for + * external-parameter-entitie property. + */ + @Test + public void testFeature10() { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setFeature(EXTERNAL_P_ENTITIES, false); + } catch (ParserConfigurationException | SAXNotRecognizedException | SAXNotSupportedException e) { + failUnexpected(e); + } + + } +} diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserTest.java b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserTest.java new file mode 100644 index 00000000000..af2c5a683b7 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserTest.java @@ -0,0 +1,559 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please 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.xml.parsers.ptests; + +import static jaxp.library.JAXPTestUtilities.failUnexpected; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.xml.sax.HandlerBase; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +/** + * Class contains the test cases for SAXParser API + */ +public class SAXParserTest { + + /** + * Provide SAXParser. + * + * @throws SAXException + * @throws ParserConfigurationException + */ + @DataProvider(name = "parser-provider") + public Object[][] getParser() throws ParserConfigurationException, SAXException { + SAXParserFactory spf = SAXParserFactory.newInstance(); + SAXParser saxparser = spf.newSAXParser(); + return new Object[][] { { saxparser } }; + } + + /** + * Test case with FileInputStream null, parsing should fail and throw + * IllegalArgumentException. + * + * @throws IllegalArgumentException + */ + @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider") + public void testParse01(SAXParser saxparser) throws IllegalArgumentException { + try { + FileInputStream instream = null; + HandlerBase handler = new HandlerBase(); + saxparser.parse(instream, handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with an error in xml file, parsing should fail and throw + * SAXException. + * + * @throws SAXException + */ + @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider") + public void testParse02(SAXParser saxparser) throws SAXException { + try { + HandlerBase handler = new HandlerBase(); + FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "invalid.xml")); + saxparser.parse(instream, handler); + } catch (IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with a valid in xml file, parser should parse the xml document. + */ + @Test(dataProvider = "parser-provider") + public void testParse03(SAXParser saxparser) { + try { + HandlerBase handler = new HandlerBase(); + saxparser.parse(new File(TestUtils.XML_DIR, "parsertest.xml"), handler); + } catch (IOException | SAXException e) { + failUnexpected(e); + } + } + + /** + * Testcase with valid input stream, parser should parse the xml document + * successfully. + */ + @Test(dataProvider = "parser-provider") + public void testParse04(SAXParser saxparser) { + try { + HandlerBase handler = new HandlerBase(); + FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "correct.xml")); + saxparser.parse(instream, handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with valid input source, parser should parse the xml document + * successfully. + */ + @Test(dataProvider = "parser-provider") + public void testParse05(SAXParser saxparser) { + try { + HandlerBase handler = new HandlerBase(); + FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "parsertest.xml")); + saxparser.parse(instream, handler, new File(TestUtils.XML_DIR).toURI().toASCIIString()); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with uri null, parsing should fail and throw + * IllegalArgumentException. + * + * @throws IllegalArgumentException + */ + @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider") + public void testParse07(SAXParser saxparser) throws IllegalArgumentException { + try { + String uri = null; + HandlerBase handler = new HandlerBase(); + saxparser.parse(uri, handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with non-existant uri, parsing should fail and throw + * IOException. + * + * @throws SAXException + * @throws IOException + */ + @Test(expectedExceptions = { SAXException.class, IOException.class }, dataProvider = "parser-provider") + public void testParse08(SAXParser saxparser) throws SAXException, IOException { + String uri = " "; + + HandlerBase handler = new HandlerBase(); + saxparser.parse(uri, handler); + + } + + /** + * Testcase with proper uri, parser should parse successfully. + */ + @Test(dataProvider = "parser-provider") + public void testParse09(SAXParser saxparser) { + try { + File file = new File(TestUtils.XML_DIR, "correct.xml"); + HandlerBase handler = new HandlerBase(); + saxparser.parse(file.toURI().toASCIIString(), handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with File null, parsing should fail and throw + * IllegalArgumentException. + * + * @throws IllegalArgumentException + */ + @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider") + public void testParse10(SAXParser saxparser) throws IllegalArgumentException { + try { + File file = null; + HandlerBase handler = new HandlerBase(); + saxparser.parse(file, handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with empty string as File, parsing should fail and throw + * SAXException. + * + * @throws SAXException + */ + @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider") + public void testParse11(SAXParser saxparser) throws SAXException { + try { + HandlerBase handler = new HandlerBase(); + File file = new File(""); + saxparser.parse(file, handler); + } catch (IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with xml file that has errors parsing should fail and throw + * SAXException. + * + * @throws SAXException + */ + @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider") + public void testParse12(SAXParser saxparser) throws SAXException { + try { + HandlerBase handler = new HandlerBase(); + File file = new File(TestUtils.XML_DIR, "valid.xml"); + saxparser.parse(file, handler); + } catch (IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with xml file that has no errors Parser should successfully + * parse the xml document. + */ + @Test(dataProvider = "parser-provider") + public void testParse13(SAXParser saxparser) { + try { + HandlerBase handler = new HandlerBase(); + File file = new File(TestUtils.XML_DIR, "correct.xml"); + saxparser.parse(file, handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + + } + + /** + * Testcase with input source null, parsing should fail and throw + * IllegalArgumentException. + * + * @throws IllegalArgumentException + */ + @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider") + public void testParse14(SAXParser saxparser) throws IllegalArgumentException { + try { + InputSource is = null; + HandlerBase handler = new HandlerBase(); + saxparser.parse(is, handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with input source attached an invaild xml, parsing should fail + * and throw SAXException. + * + * @throws SAXException + */ + @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider") + public void testParse15(SAXParser saxparser) throws SAXException { + try { + HandlerBase handler = new HandlerBase(); + FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "invalid.xml")); + InputSource is = new InputSource(instream); + saxparser.parse(is, handler); + } catch (IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with input source attached an vaild xml, parser should + * successfully parse the xml document. + */ + @Test(dataProvider = "parser-provider") + public void testParse16(SAXParser saxparser) { + try { + HandlerBase handler = new HandlerBase(); + FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "correct.xml")); + InputSource is = new InputSource(instream); + saxparser.parse(is, handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with FileInputStream null, parsing should fail and throw + * IllegalArgumentException. + * + * @throws IllegalArgumentException + */ + @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider") + public void testParse17(SAXParser saxparser) throws IllegalArgumentException { + try { + FileInputStream instream = null; + DefaultHandler handler = new DefaultHandler(); + saxparser.parse(instream, handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with an error in xml file, parsing should fail and throw + * SAXException. + * + * @throws SAXException + */ + @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider") + public void testParse18(SAXParser saxparser) throws SAXException { + try { + DefaultHandler handler = new DefaultHandler(); + FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "invalid.xml")); + saxparser.parse(instream, handler); + } catch (IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with valid input stream, parser should parse the xml document + * successfully. + */ + @Test(dataProvider = "parser-provider") + public void testParse19(SAXParser saxparser) { + try { + DefaultHandler handler = new DefaultHandler(); + saxparser.parse(new File(TestUtils.XML_DIR, "parsertest.xml"), handler); + } catch (IOException | SAXException e) { + failUnexpected(e); + } + } + + /** + * Testcase with valid input stream, parser should parse the xml document + * successfully. + */ + @Test(dataProvider = "parser-provider") + public void testParse20(SAXParser saxparser) { + try { + DefaultHandler handler = new DefaultHandler(); + FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "correct.xml")); + saxparser.parse(instream, handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with valid input source, parser should parse the xml document + * successfully. + */ + @Test(dataProvider = "parser-provider") + public void testParse21(SAXParser saxparser) { + try { + DefaultHandler handler = new DefaultHandler(); + FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "parsertest.xml")); + saxparser.parse(instream, handler, new File(TestUtils.XML_DIR).toURI().toASCIIString()); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + + } + + /** + * Testcase with uri null, parsing should fail and throw + * IllegalArgumentException. + * + * @throws IllegalArgumentException + */ + @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider") + public void testParse23(SAXParser saxparser) throws IllegalArgumentException { + try { + String uri = null; + DefaultHandler handler = new DefaultHandler(); + saxparser.parse(uri, handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with non-existant uri, parsing should fail and throw + * SAXException or IOException. + * + * @throws SAXException + * @throws IOException + */ + @Test(expectedExceptions = { SAXException.class, IOException.class }, dataProvider = "parser-provider") + public void testParse24(SAXParser saxparser) throws SAXException, IOException { + String uri = " "; + DefaultHandler handler = new DefaultHandler(); + saxparser.parse(uri, handler); + + } + + /** + * Testcase with proper uri, parser should parse successfully. + */ + @Test(dataProvider = "parser-provider") + public void testParse25(SAXParser saxparser) { + try { + File file = new File(TestUtils.XML_DIR, "correct.xml"); + + DefaultHandler handler = new DefaultHandler(); + saxparser.parse(file.toURI().toASCIIString(), handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with File null, parsing should fail and throw + * IllegalArgumentException. + * + * @throws IllegalArgumentException + */ + @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider") + public void testParse26(SAXParser saxparser) throws IllegalArgumentException { + try { + DefaultHandler handler = new DefaultHandler(); + saxparser.parse((File) null, handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with empty string as File, parsing should fail and throw + * SAXException. + * + * @throws SAXException + */ + @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider") + public void testParse27(SAXParser saxparser) throws SAXException { + try { + DefaultHandler handler = new DefaultHandler(); + File file = new File(""); + saxparser.parse(file, handler); + } catch (IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with xml file that has errors, parsing should fail and throw + * SAXException. + * + * @throws SAXException + */ + @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider") + public void testParse28(SAXParser saxparser) throws SAXException { + try { + DefaultHandler handler = new DefaultHandler(); + File file = new File(TestUtils.XML_DIR, "valid.xml"); + saxparser.parse(file, handler); + } catch (IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with xml file that has no errors, parser should successfully + * parse the xml document. + */ + @Test(dataProvider = "parser-provider") + public void testParse29(SAXParser saxparser) { + try { + DefaultHandler handler = new DefaultHandler(); + File file = new File(TestUtils.XML_DIR, "correct.xml"); + saxparser.parse(file, handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with input source null, parsing should fail and throw + * IllegalArgumentException. + * + * @throws IllegalArgumentException + */ + @Test(expectedExceptions = IllegalArgumentException.class, dataProvider = "parser-provider") + public void testParse30(SAXParser saxparser) throws IllegalArgumentException { + try { + InputSource is = null; + DefaultHandler handler = new DefaultHandler(); + saxparser.parse(is, handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Testcase with an invalid xml file, parser should throw SAXException. + * + * @throws SAXException + */ + @Test(expectedExceptions = SAXException.class, dataProvider = "parser-provider") + public void testParse31(SAXParser saxparser) throws SAXException { + try { + DefaultHandler handler = new DefaultHandler(); + FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "invalid.xml")); + InputSource is = new InputSource(instream); + saxparser.parse(is, handler); + } catch (IOException e) { + failUnexpected(e); + } + } + + /** + * Test case to parse an xml file that not use namespaces. + */ + @Test(dataProvider = "parser-provider") + public void testParse32(SAXParser saxparser) { + try { + DefaultHandler handler = new DefaultHandler(); + FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "correct.xml")); + InputSource is = new InputSource(instream); + saxparser.parse(is, handler); + } catch (SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * Test case to parse an xml file that uses namespaces. + */ + @Test + public void testParse33() { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setNamespaceAware(true); + SAXParser saxparser = spf.newSAXParser(); + HandlerBase handler = new HandlerBase(); + FileInputStream instream = new FileInputStream(new File(TestUtils.XML_DIR, "ns4.xml")); + saxparser.parse(instream, handler); + } catch (ParserConfigurationException | SAXException | IOException e) { + failUnexpected(e); + } + } +} diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserTest02.java b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserTest02.java new file mode 100644 index 00000000000..9bfd3ef4c4e --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserTest02.java @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please 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.xml.parsers.ptests; + +import static jaxp.library.JAXPTestUtilities.failUnexpected; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNull; +import static org.testng.Assert.assertTrue; + +import javax.xml.parsers.FactoryConfigurationError; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.xml.sax.Parser; +import org.xml.sax.SAXException; +import org.xml.sax.SAXNotRecognizedException; +import org.xml.sax.SAXNotSupportedException; +import org.xml.sax.XMLReader; +import org.xml.sax.ext.DeclHandler; +import org.xml.sax.ext.LexicalHandler; + +/** + * Class contains the test cases for SAXParser API + */ +public class SAXParserTest02 { + final String DOM_NODE = "http://xml.org/sax/properties/dom-node"; + final String XML_STRING = "http://xml.org/sax/properties/xml-string"; + final String DECL_HANDLER = "http://xml.org/sax/properties/declaration-handler"; + final String LEXICAL_HANDLER = "http://xml.org/sax/properties/lexical-handler"; + + /** + * Provide SAXParser. + * + * @throws SAXException + * @throws ParserConfigurationException + */ + @DataProvider(name = "parser-provider") + public Object[][] getParser() throws ParserConfigurationException, SAXException { + SAXParserFactory spf = SAXParserFactory.newInstance(); + SAXParser saxparser = spf.newSAXParser(); + return new Object[][] { { saxparser } }; + } + + /** + * Testcase to test the default functionality (No validation) of the parser. + */ + @Test(dataProvider = "parser-provider") + public void testValidate01(SAXParser saxparser) { + try { + assertFalse(saxparser.isValidating()); + } catch (FactoryConfigurationError e) { + failUnexpected(e); + } + + } + + /** + * Testcase to test the functionality of setValidating and isvalidating + * methods. + */ + @Test + public void testValidate02() { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setValidating(true); + spf.newSAXParser(); + assertTrue(spf.isValidating()); + } catch (FactoryConfigurationError | ParserConfigurationException | SAXException e) { + failUnexpected(e); + } + + } + + /** + * Test case to test isNamespaceAware() method. By default, namespaces are + * not supported. + */ + @Test(dataProvider = "parser-provider") + public void testNamespace01(SAXParser saxparser) { + try { + assertFalse(saxparser.isNamespaceAware()); + } catch (FactoryConfigurationError e) { + failUnexpected(e); + } + + } + + /** + * Test case to test setnamespaceAware() method. + */ + @Test + public void testNamespace02() { + try { + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setNamespaceAware(true); + SAXParser saxparser = spf.newSAXParser(); + assertTrue(saxparser.isNamespaceAware()); + } catch (FactoryConfigurationError | ParserConfigurationException | SAXException e) { + failUnexpected(e); + } + + } + + /** + * Test case to test if the getParser() method returns instance of Parser. + */ + @Test(dataProvider = "parser-provider") + public void testParser01(SAXParser saxparser) { + try { + Parser parser = saxparser.getParser(); + } catch (FactoryConfigurationError | SAXException e) { + failUnexpected(e); + } + + } + + /** + * Test case to test if the getXMLReader() method returns instance of + * XMLReader. + */ + @Test(dataProvider = "parser-provider") + public void testXmlReader01(SAXParser saxparser) { + try { + XMLReader xmlReader = saxparser.getXMLReader(); + } catch (FactoryConfigurationError | SAXException e) { + failUnexpected(e); + } + } + + /** + * Test whether the xml-string property is not supported. + * + * @throws SAXNotSupportedException + */ + @Test(expectedExceptions = SAXNotSupportedException.class, dataProvider = "parser-provider") + public void testProperty01(SAXParser saxparser) throws SAXNotSupportedException { + try { + Object object = saxparser.getProperty(XML_STRING); + } catch (SAXNotRecognizedException e) { + failUnexpected(e); + } + } + + /** + * Test whether the dom-node property is not supported. + * + * @throws SAXNotSupportedException + */ + @Test(expectedExceptions = SAXNotSupportedException.class, dataProvider = "parser-provider") + public void testProperty02(SAXParser saxparser) throws SAXNotSupportedException { + try { + Object object = saxparser.getProperty(DOM_NODE); + } catch (SAXNotRecognizedException e) { + failUnexpected(e); + } + } + + /** + * Test the default lexical-handler not exists. + */ + @Test(dataProvider = "parser-provider") + public void testProperty03(SAXParser saxparser) { + try { + assertNull(saxparser.getProperty(LEXICAL_HANDLER)); + } catch (SAXException e) { + failUnexpected(e); + } + + } + + /** + * Test the default declaration-handler not exists. + */ + @Test(dataProvider = "parser-provider") + public void testProperty04(SAXParser saxparser) { + + try { + assertNull(saxparser.getProperty(DECL_HANDLER)); + } catch (SAXException e) { + failUnexpected(e); + } + } + + /** + * Test to set and get the lexical-handler. + */ + @Test(dataProvider = "parser-provider") + public void testProperty05(SAXParser saxparser) { + try { + MyLexicalHandler myLexicalHandler = new MyLexicalHandler(); + saxparser.setProperty(LEXICAL_HANDLER, myLexicalHandler); + Object object = saxparser.getProperty(LEXICAL_HANDLER); + assertTrue(object instanceof LexicalHandler); + } catch (SAXException e) { + failUnexpected(e); + } + } + + /** + * Test to set and get the declaration-handler. + */ + @Test(dataProvider = "parser-provider") + public void testProperty06(SAXParser saxparser) { + try { + MyDeclHandler myDeclHandler = new MyDeclHandler(); + saxparser.setProperty(DECL_HANDLER, myDeclHandler); + Object object = saxparser.getProperty(DECL_HANDLER); + assertTrue(object instanceof DeclHandler); + } catch (SAXException e) { + failUnexpected(e); + } + + } + + /** + * Customized LexicalHandler used for test. + */ + private class MyLexicalHandler implements LexicalHandler { + + public void comment(char[] ch, int start, int length) { + } + + public void endCDATA() { + } + + public void endDTD() { + } + + public void endEntity(String name) { + } + + public void startCDATA() { + } + + public void startDTD(String name, String publicId, String systemId) { + } + + public void startEntity(String name) { + } + } + + /** + * Customized DeclHandler used for test. + */ + private class MyDeclHandler implements DeclHandler { + + public void attributeDecl(String eName, String aName, String type, String valueDefault, String value) { + } + + public void elementDecl(String name, String model) { + } + + public void externalEntityDecl(String name, String publicId, String systemId) { + } + + public void internalEntityDecl(String name, String value) { + } + } +} diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserTest03.java b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserTest03.java new file mode 100644 index 00000000000..efe12c595d6 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/SAXParserTest03.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please 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.xml.parsers.ptests; + +import static jaxp.library.JAXPTestUtilities.failUnexpected; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertTrue; + +import java.io.File; +import java.io.IOException; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; + +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import org.xml.sax.SAXException; + +/** + * Class contains the test cases for SAXParser API + */ +public class SAXParserTest03 { + + /** + * Provide SAXParserFactory. + * + * @throws Exception + */ + @DataProvider(name = "input-provider") + public Object[][] getFactory() { + SAXParserFactory spf = SAXParserFactory.newInstance(); + spf.setValidating(true); + MyErrorHandler handler = MyErrorHandler.newInstance(); + return new Object[][] { { spf, handler } }; + } + + /** + * parsertest.xml holds a valid document. This method tests the validating + * parser. + */ + @Test(dataProvider = "input-provider") + public void testParseValidate01(SAXParserFactory spf, MyErrorHandler handler) { + try { + SAXParser saxparser = spf.newSAXParser(); + saxparser.parse(new File(TestUtils.XML_DIR, "parsertest.xml"), handler); + assertFalse(handler.errorOccured); + } catch (ParserConfigurationException | SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * validns.xml holds a valid document with XML namespaces in it. This method + * tests the Validating parser with namespace processing on. + */ + @Test(dataProvider = "input-provider") + public void testParseValidate02(SAXParserFactory spf, MyErrorHandler handler) { + try { + spf.setNamespaceAware(true); + SAXParser saxparser = spf.newSAXParser(); + saxparser.parse(new File(TestUtils.XML_DIR, "validns.xml"), handler); + assertFalse(handler.errorOccured); + } catch (ParserConfigurationException | SAXException | IOException e) { + failUnexpected(e); + } + } + + /** + * invalidns.xml holds an invalid document with XML namespaces in it. This + * method tests the validating parser with namespace processing on. It + * should throw validation error. + */ + @Test(dataProvider = "input-provider") + public void testParseValidate03(SAXParserFactory spf, MyErrorHandler handler) { + try { + spf.setNamespaceAware(true); + SAXParser saxparser = spf.newSAXParser(); + saxparser.parse(new File(TestUtils.XML_DIR, "invalidns.xml"), handler); + failUnexpected(new RuntimeException()); + } catch (ParserConfigurationException | SAXException | IOException e) { + if (e instanceof SAXException) { + assertTrue(handler.errorOccured); + } + } + } + +} diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/TestUtils.java b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/TestUtils.java new file mode 100644 index 00000000000..9f8dc355333 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/TestUtils.java @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please 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.xml.parsers.ptests; + +import static jaxp.library.JAXPTestUtilities.ERROR_MSG_HEADER; +import static jaxp.library.JAXPTestUtilities.FILE_SEP; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; + +import org.xml.sax.Attributes; +import org.xml.sax.Locator; +import org.xml.sax.SAXParseException; +import org.xml.sax.helpers.DefaultHandler; +import org.xml.sax.helpers.LocatorImpl; + +/** + * Utility interface which includes final variables of xml, golden file + * directories. + */ +interface TestUtils { + final String XML_DIR = System.getProperty("test.src", ".") + FILE_SEP + "javax/xml/parsers/xmlfiles"; + final String GOLDEN_DIR = XML_DIR + FILE_SEP + "out"; +} + +/** + * Customized DefaultHandler which writes output document when methods are + * called by Transformer. Test may use output document to compare with golden + * file for verification. + */ +class MyCHandler extends DefaultHandler { + + private final BufferedWriter bWriter; + private final Locator locator = new LocatorImpl(); + + private MyCHandler(File file) throws IOException { + bWriter = new BufferedWriter(new FileWriter(file)); + } + + public static MyCHandler newInstance(File file) throws IOException { + MyCHandler handler = new MyCHandler(file); + return handler; + } + + public void characters(char[] ch, int start, int length) { + String s = new String(ch, start, length); + String str = String.format("characters...length is:%d\n<%s>", s.length(), s); + try { + bWriter.write(str, 0, str.length()); + bWriter.newLine(); + } catch (IOException e) { + throw new RuntimeException(ERROR_MSG_HEADER, e); + } + } + + public void endDocument() { + String str = "endDocument..."; + try { + bWriter.write(str, 0, str.length()); + bWriter.newLine(); + bWriter.flush(); + bWriter.close(); + + } catch (IOException e) { + throw new RuntimeException(ERROR_MSG_HEADER, e); + } + } + + public void endElement(String namespaceURI, String localName, String qName) { + String str = String.format("endElement...\nnamespaceURI: <%s> localName: <%s> qName: <%s>", namespaceURI, localName, qName); + try { + bWriter.write(str, 0, str.length()); + bWriter.newLine(); + } catch (IOException e) { + throw new RuntimeException(ERROR_MSG_HEADER, e); + } + } + + public void endPrefixMapping(String prefix) { + String str = String.format("endPrefixMapping...\nprefix: <%s>", prefix); + try { + bWriter.write(str, 0, str.length()); + bWriter.newLine(); + } catch (IOException e) { + throw new RuntimeException(ERROR_MSG_HEADER, e); + } + } + + public void ignorableWhitespace(char[] ch, int start, int length) { + String s = new String(ch, start, length); + String str = String.format("ignorableWhitespace...\n%s ignorable white space string length: %d", s, s.length()); + try { + bWriter.write(str, 0, str.length()); + bWriter.newLine(); + } catch (IOException e) { + throw new RuntimeException(ERROR_MSG_HEADER, e); + } + } + + public void processingInstruction(String target, String data) { + String str = String.format("processingInstruction...target:<%s> data: <%s>", target, data); + try { + bWriter.write(str, 0, str.length()); + bWriter.newLine(); + } catch (IOException e) { + throw new RuntimeException(ERROR_MSG_HEADER, e); + } + } + + public void skippedEntity(String name) { + String str = String.format("skippedEntity...\nname: <%s>", name); + try { + bWriter.write(str, 0, str.length()); + bWriter.newLine(); + } catch (IOException e) { + throw new RuntimeException(ERROR_MSG_HEADER, e); + } + } + + public void startDocument() { + String str = "startDocument..."; + try { + bWriter.write(str, 0, str.length()); + bWriter.newLine(); + } catch (IOException e) { + throw new RuntimeException(ERROR_MSG_HEADER, e); + } + } + + public void startElement(String namespaceURI, String localName, String qName, Attributes atts) { + String str = String.format("startElement...\nnamespaceURI: <%s> localName: <%s> qName: <%s> Number of Attributes: <%d> Line# <%d>", namespaceURI, + localName, qName, atts.getLength(), locator.getLineNumber()); + try { + bWriter.write(str, 0, str.length()); + bWriter.newLine(); + } catch (IOException e) { + throw new RuntimeException(ERROR_MSG_HEADER, e); + } + } + + public void startPrefixMapping(String prefix, String uri) { + String str = String.format("startPrefixMapping...\nprefix: <%s> uri: <%s>", prefix, uri); + try { + bWriter.write(str, 0, str.length()); + bWriter.newLine(); + } catch (IOException e) { + throw new RuntimeException(ERROR_MSG_HEADER, e); + } + } +} + +/** + * Customized DefaultHandler used for SAXParseException testing. + */ +class MyErrorHandler extends DefaultHandler { + boolean errorOccured = false; + + private MyErrorHandler() { + } + + public static MyErrorHandler newInstance() { + return new MyErrorHandler(); + } + + public void error(SAXParseException e) { + errorOccured = true; + } + + public void warning(SAXParseException e) { + errorOccured = true; + } + + public void fatalError(SAXParseException e) { + errorOccured = true; + } +} diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory01.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory01.xml new file mode 100644 index 00000000000..fbd395050da --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory01.xml @@ -0,0 +1,4 @@ + + +This is not parsed]]> yet + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory02.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory02.xml new file mode 100644 index 00000000000..df31079b448 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory02.xml @@ -0,0 +1,9 @@ + + + + +]> + + &ws; + \ No newline at end of file diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory03.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory03.xml new file mode 100644 index 00000000000..6b46e0066cc --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory03.xml @@ -0,0 +1,9 @@ + + + + +]> + + &ws; + \ No newline at end of file diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory04.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory04.xml new file mode 100644 index 00000000000..febbd6e4498 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory04.xml @@ -0,0 +1,19 @@ + + + + + + + + + +]> + + xmlns:br="http://www.abc.com"> +Tove +Jani +Next +Reminder + weekend! + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory05.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory05.xml new file mode 100644 index 00000000000..29ff804df9b --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory05.xml @@ -0,0 +1,16 @@ + + + + + + +]> + + xmlns:br="http://www.abc.com"> +Tove +Jani +Next +Reminder + weekend! + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory06.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory06.xml new file mode 100644 index 00000000000..8774a5ac5f5 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory06.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + +]> + + + + +John + + + with whitespace + Jani +Next +Reminder + weekend! + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory07.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory07.xml new file mode 100644 index 00000000000..a0c5f387d00 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory07.xml @@ -0,0 +1,9 @@ + + + +]> + +Tove + + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory08.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory08.xml new file mode 100644 index 00000000000..8bc74d7ad8d --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderFactory08.xml @@ -0,0 +1,5 @@ + + +Tove + + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderImpl01.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderImpl01.xml new file mode 100644 index 00000000000..fbd395050da --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderImpl01.xml @@ -0,0 +1,4 @@ + + +This is not parsed]]> yet + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderImpl02.dtd b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderImpl02.dtd new file mode 100644 index 00000000000..28b8a7b586a --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderImpl02.dtd @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderImpl02.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderImpl02.xml new file mode 100644 index 00000000000..89e09643844 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/DocumentBuilderImpl02.xml @@ -0,0 +1,28 @@ + + + + + Publishers of the Music of New York Women Composers + + The Publishers + + + Alfred Publishing + &w; + 15535 Morrison + South Oaks CA 91403 + + + + eXtensible Markup Language + + + + + + Publishers are not noted in report by time. + + + + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/correct.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/correct.xml new file mode 100644 index 00000000000..5c137300c85 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/correct.xml @@ -0,0 +1,23 @@ + + + Publishers of the Music of New York Women Composers + + The Publishers + + + Alfred Publishing + 15535 Morrison + South Oaks CA 91403 + + + + eXtensible Markup Language + + + + + + Publishers are not noted in report by time. + + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/dbf10.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/dbf10.xml new file mode 100644 index 00000000000..f73db963097 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/dbf10.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/dbf10.xsl b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/dbf10.xsl new file mode 100644 index 00000000000..b8b354d8afe --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/dbf10.xsl @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/dbf10import.xsl b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/dbf10import.xsl new file mode 100644 index 00000000000..4a72677c638 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/dbf10import.xsl @@ -0,0 +1,5 @@ + + + + + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/dbf10include.xsl b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/dbf10include.xsl new file mode 100644 index 00000000000..690055f8c22 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/dbf10include.xsl @@ -0,0 +1,5 @@ + + + + + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/firstdtd.dtd b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/firstdtd.dtd new file mode 100644 index 00000000000..6fbfdfeb67b --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/firstdtd.dtd @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/invalid.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/invalid.xml new file mode 100644 index 00000000000..18b1e6175bc --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/invalid.xml @@ -0,0 +1,24 @@ + + + Publishers of the Music of New York Women Composers + + The Publishers + + + Alfred Publishing + &mkm; + 15535 Morrison + South Oaks CA 91403 + + + + eXtensible Markup Language + + + + + + Publishers are not noted in report by time. + + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/invalidns.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/invalidns.xml new file mode 100644 index 00000000000..5ce64b9733a --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/invalidns.xml @@ -0,0 +1,16 @@ + + + + + + + +]> + + 4star + 3star + 2star + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/namespace1.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/namespace1.xml new file mode 100644 index 00000000000..580e279c407 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/namespace1.xml @@ -0,0 +1,15 @@ + + + + Typography + + + +

Welcome to the world of typography! Here is a book that you may find useful.

+ Digital Typography + Donald Knuth + + + + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/ns4.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/ns4.xml new file mode 100644 index 00000000000..0cfb9b5c38c --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/ns4.xml @@ -0,0 +1,8 @@ +
Book-Signing Event + + + + + + +
diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/out/dbfactory02GF.out b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/out/dbfactory02GF.out new file mode 100644 index 00000000000..6a628236b62 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/out/dbfactory02GF.out @@ -0,0 +1,83 @@ +startDocument... +startPrefixMapping... +prefix: uri: +startPrefixMapping... +prefix:
uri: +startElement... +namespaceURI: <> localName: qName: Number of Attributes: <2> Line# <0> +characters...length is:1 +< +> +startElement... +namespaceURI: <> localName: qName: Number of Attributes: <0> Line# <0> +startElement... +namespaceURI: <> localName: qName: Number of Attributes: <0> Line# <0> +characters...length is:4 + +endElement... +namespaceURI: <> localName: qName: +endElement... +namespaceURI: <> localName: qName: +characters...length is:1 +< +> +startElement... +namespaceURI: <> localName: qName: Number of Attributes: <0> Line# <0> +startElement... +namespaceURI: <> localName: qName: Number of Attributes: <0> Line# <0> +characters...length is:15 + +endElement... +namespaceURI: <> localName: qName: +endElement... +namespaceURI: <> localName: qName: +characters...length is:1 +< +> +startElement... +namespaceURI: localName: qName: Number of Attributes: <0> Line# <0> +startElement... +namespaceURI: <> localName: qName: Number of Attributes: <0> Line# <0> +characters...length is:4 + +endElement... +namespaceURI: <> localName: qName: +endElement... +namespaceURI: localName: qName: +characters...length is:1 +< +> +startElement... +namespaceURI: localName: qName: Number of Attributes: <0> Line# <0> +characters...length is:4 + +endElement... +namespaceURI: localName: qName: +characters...length is:1 +< +> +startElement... +namespaceURI: <> localName: qName: Number of Attributes: <0> Line# <0> +characters...length is:8 + +endElement... +namespaceURI: <> localName: qName: +characters...length is:1 +< +> +startElement... +namespaceURI: <> localName: qName: Number of Attributes: <0> Line# <0> +characters...length is:9 +< weekend!> +endElement... +namespaceURI: <> localName: qName: +characters...length is:1 +< +> +endElement... +namespaceURI: <> localName: qName: +endPrefixMapping... +prefix:
+endPrefixMapping... +prefix: +endDocument... diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/out/dbfnstest01GF.out b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/out/dbfnstest01GF.out new file mode 100644 index 00000000000..1ec64f52eef --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/out/dbfnstest01GF.out @@ -0,0 +1,79 @@ +startDocument... +startPrefixMapping... +prefix: <> uri: +startPrefixMapping... +prefix: uri: +startElement... +namespaceURI: localName: qName: Number of Attributes: <2> Line# <0> +characters...length is:3 +< + > +startElement... +namespaceURI: localName: qName: Number of Attributes: <0> Line# <0> +characters...length is:5 +< + > +startElement... +namespaceURI: localName: qName: <title> Number of Attributes: <0> Line# <0> +characters...length is:10 +<Typography> +endElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <title> qName: <title> +characters...length is:3 +< + > +endElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <head> qName: <head> +characters...length is:4 +< + + > +startElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <body> qName: <body> Number of Attributes: <0> Line# <0> +characters...length is:5 +< + > +startElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <p> qName: <p> Number of Attributes: <0> Line# <0> +characters...length is:77 +< Welcome to the world of typography! Here is a book that you may find useful.> +endElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <p> qName: <p> +characters...length is:5 +< + > +startElement... +namespaceURI: <urn:BooksAreUs.org:BookInfo> localName: <title> qName: <b:title> Number of Attributes: <1> Line# <0> +characters...length is:18 +<Digital Typography> +endElement... +namespaceURI: <urn:BooksAreUs.org:BookInfo> localName: <title> qName: <b:title> +characters...length is:6 +< + > +startElement... +namespaceURI: <urn:BooksAreUs.org:BookInfo> localName: <author> qName: <b:author> Number of Attributes: <0> Line# <0> +characters...length is:12 +<Donald Knuth> +endElement... +namespaceURI: <urn:BooksAreUs.org:BookInfo> localName: <author> qName: <b:author> +characters...length is:5 +< + > +processingInstruction...target:<netscape> data: <http://www.hotmail.com> +characters...length is:3 +< + > +endElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <body> qName: <body> +characters...length is:2 +< + +> +endElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <html> qName: <html> +endPrefixMapping... +prefix: <b> +endPrefixMapping... +prefix: <> +endDocument... diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/out/dbfnstest02GF.out b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/out/dbfnstest02GF.out new file mode 100644 index 00000000000..1ec64f52eef --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/out/dbfnstest02GF.out @@ -0,0 +1,79 @@ +startDocument... +startPrefixMapping... +prefix: <> uri: <http://www.w3.org/TR/REC-html40> +startPrefixMapping... +prefix: <b> uri: <urn:BooksAreUs.org:BookInfo> +startElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <html> qName: <html> Number of Attributes: <2> Line# <0> +characters...length is:3 +< + > +startElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <head> qName: <head> Number of Attributes: <0> Line# <0> +characters...length is:5 +< + > +startElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <title> qName: <title> Number of Attributes: <0> Line# <0> +characters...length is:10 +<Typography> +endElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <title> qName: <title> +characters...length is:3 +< + > +endElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <head> qName: <head> +characters...length is:4 +< + + > +startElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <body> qName: <body> Number of Attributes: <0> Line# <0> +characters...length is:5 +< + > +startElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <p> qName: <p> Number of Attributes: <0> Line# <0> +characters...length is:77 +< Welcome to the world of typography! Here is a book that you may find useful.> +endElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <p> qName: <p> +characters...length is:5 +< + > +startElement... +namespaceURI: <urn:BooksAreUs.org:BookInfo> localName: <title> qName: <b:title> Number of Attributes: <1> Line# <0> +characters...length is:18 +<Digital Typography> +endElement... +namespaceURI: <urn:BooksAreUs.org:BookInfo> localName: <title> qName: <b:title> +characters...length is:6 +< + > +startElement... +namespaceURI: <urn:BooksAreUs.org:BookInfo> localName: <author> qName: <b:author> Number of Attributes: <0> Line# <0> +characters...length is:12 +<Donald Knuth> +endElement... +namespaceURI: <urn:BooksAreUs.org:BookInfo> localName: <author> qName: <b:author> +characters...length is:5 +< + > +processingInstruction...target:<netscape> data: <http://www.hotmail.com> +characters...length is:3 +< + > +endElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <body> qName: <body> +characters...length is:2 +< + +> +endElement... +namespaceURI: <http://www.w3.org/TR/REC-html40> localName: <html> qName: <html> +endPrefixMapping... +prefix: <b> +endPrefixMapping... +prefix: <> +endDocument... diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/parsertest.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/parsertest.xml new file mode 100644 index 00000000000..3d3192f4045 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/parsertest.xml @@ -0,0 +1,25 @@ +<?xml version="1.0" standalone="no"?> +<!DOCTYPE document SYSTEM "firstdtd.dtd"> +<document> + Publishers of the Music of New York Women Composers + + <title>The Publishers + + + Alfred Publishing + &mkm; + 15535 Morrison + South Oaks CA 91403 + + + + eXtensible Markup Language + + + + + + Publishers are not noted in report by time. + + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/test.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/test.xml new file mode 100644 index 00000000000..8ad28618d01 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/test.xml @@ -0,0 +1,5 @@ + + + John +444-121-3434 + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/test.xsd b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/test.xsd new file mode 100644 index 00000000000..1671283691c --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/test.xsd @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/test1.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/test1.xml new file mode 100644 index 00000000000..45de38a3bce --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/test1.xml @@ -0,0 +1,5 @@ + + + John +444-121-3434 + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/valid.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/valid.xml new file mode 100644 index 00000000000..18b1e6175bc --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/valid.xml @@ -0,0 +1,24 @@ + + + Publishers of the Music of New York Women Composers + + The Publishers + + + Alfred Publishing + &mkm; + 15535 Morrison + South Oaks CA 91403 + + + + eXtensible Markup Language + + + + + + Publishers are not noted in report by time. + + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/validns.xml b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/validns.xml new file mode 100644 index 00000000000..805b468e74e --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/xmlfiles/validns.xml @@ -0,0 +1,14 @@ + + + + + + +]> + + 4star + 3star + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TransformerFactoryTest.java b/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TransformerFactoryTest.java index 1c92fd67316..45099ebb19c 100644 --- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TransformerFactoryTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/transform/ptests/TransformerFactoryTest.java @@ -61,33 +61,25 @@ public class TransformerFactoryTest { String xmlFile = XML_DIR + "TransformerFactoryTest.xml"; String xmlURI = "file:///" + XML_DIR; - try { + try (FileInputStream fis = new FileInputStream(xmlFile); + FileOutputStream fos = new FileOutputStream(outputFile);) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); - Document doc = db.parse(new FileInputStream(xmlFile), xmlURI); + Document doc = db.parse(fis, xmlURI); DOMSource domSource = new DOMSource(doc); domSource.setSystemId(xmlURI); - StreamResult streamResult =new StreamResult( - new FileOutputStream(outputFile)); + StreamResult streamResult = new StreamResult(fos); TransformerFactory tFactory = TransformerFactory.newInstance(); - Source s = tFactory.getAssociatedStylesheet(domSource,"screen", - "Modern",null); + Source s = tFactory.getAssociatedStylesheet(domSource, "screen", + "Modern", null); Transformer t = tFactory.newTransformer(); - t.transform(s,streamResult); + t.transform(s, streamResult); assertTrue(compareWithGold(goldFile, outputFile)); - }catch (IOException | ParserConfigurationException + } catch (IOException | ParserConfigurationException | TransformerException | SAXException ex) { failUnexpected(ex); - } finally { - try { - Path outputPath = Paths.get(outputFile); - if(Files.exists(outputPath)) - Files.delete(outputPath); - } catch (IOException ex) { - failCleanup(ex, outputFile); - } } } } diff --git a/jaxws/.hgtags b/jaxws/.hgtags index 65daeb64249..defa79ac988 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -287,3 +287,4 @@ dd4ba422dba858b1c3c4b38f49a3e514be4e2790 jdk9-b38 381bad1174c7c27352bee604535332da4ee2c556 jdk9-b39 5455969de31f3083bcfd779b7acc3ab758ecb308 jdk9-b40 4f785187377fe4c7ff388a7026dd72fcccdcfe7a jdk9-b41 +301ddb4478fb36d1f025d14e7e48c2a434e9e6ff jdk9-b42 diff --git a/jdk/.hgtags b/jdk/.hgtags index ce5d84d50b5..fa59d457917 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -284,3 +284,4 @@ d2d745313c81d1fc01f426983b9f784ab1f750e8 jdk9-b38 ca6edf957fe1c6ea818530b503578e872cea7239 jdk9-b39 f1ed1540da70a066527fd043413107e47721edbf jdk9-b40 e336cbd8b15e959e70ed02f0f5e93fa76ebd4c07 jdk9-b41 +6b2314173433467245261364a52fb8e347fe6342 jdk9-b42 diff --git a/jdk/make/CompileInterimRmic.gmk b/jdk/make/CompileInterimRmic.gmk index 003a4af73e7..f31db8dfd04 100644 --- a/jdk/make/CompileInterimRmic.gmk +++ b/jdk/make/CompileInterimRmic.gmk @@ -46,8 +46,7 @@ $(eval $(call SetupJavaCompilation,BUILD_INTERIM_RMIC, \ SRC := $(JDK_TOPDIR)/src/jdk.rmic/share/classes, \ INCLUDES := $(RMIC_PKGS), \ BIN := $(BUILDTOOLS_OUTPUTDIR)/interim_rmic_classes, \ - COPY := .properties, \ - JAVAC_SOURCE_PATH_OVERRIDE := $(addprefix $(JDK_TOPDIR)/src/jdk.rmic/share/classes/, $(RMIC_PKGS)))) + COPY := .properties)) ########################################################################################## diff --git a/jdk/make/Import.gmk b/jdk/make/Import.gmk index 58be77341ca..9e743349437 100644 --- a/jdk/make/Import.gmk +++ b/jdk/make/Import.gmk @@ -221,8 +221,13 @@ $(JDK_OUTPUTDIR)/modules/jdk.hotspot.agent/_the.sa.jar.unpacked: $(HOTSPOT_DIST) # even if zip is already unpacked. $(SUPPORT_OUTPUTDIR)/gensrc/jdk.hotspot.agent/_the.sa.services: $(HOTSPOT_DIST)/lib/sa-jdi.jar -SA_TARGETS += $(JDK_OUTPUTDIR)/modules/jdk.hotspot.agent/_the.sa.jar.unpacked \ - $(SUPPORT_OUTPUTDIR)/gensrc/jdk.hotspot.agent/_the.sa.services +# Some platforms don't have the serviceability agent +ifeq (, $(filter $(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU), aix-ppc64)) + ifneq ($(JVM_VARIANT_ZERO), true) + SA_TARGETS += $(JDK_OUTPUTDIR)/modules/jdk.hotspot.agent/_the.sa.jar.unpacked \ + $(SUPPORT_OUTPUTDIR)/gensrc/jdk.hotspot.agent/_the.sa.services + endif +endif ################################################################################ diff --git a/jdk/make/gendata/GendataBreakIterator.gmk b/jdk/make/gendata/GendataBreakIterator.gmk index 1db16158e76..6c60ec26d6b 100644 --- a/jdk/make/gendata/GendataBreakIterator.gmk +++ b/jdk/make/gendata/GendataBreakIterator.gmk @@ -44,17 +44,10 @@ TEXT_SOURCES := $(TEXT_PKG)/BreakIteratorRules.java \ # Generate BreakIteratorData BREAK_ITERATOR_CLASSES := $(BUILDTOOLS_OUTPUTDIR)/break_iterator_classes -# JAVAC_SOURCE_PATH_OVERRIDE is set to isolate the compile to just those -# two files in that directory and not get anything implicit from -# surrounding directories which aren't jdk N-1 compatible. -# Because we are targeting jdk N-1, but the surrounding source code is jdk N. -# These two files should be moved out to a build tool! We have to disable -# sjavac here as well. +# These two files should be moved out to a build tool! $(eval $(call SetupJavaCompilation,BUILD_BREAKITERATOR, \ SETUP := GENERATE_OLDBYTECODE, \ SRC := $(TEXT_SRCDIR), \ - DISABLE_SJAVAC := true, \ - JAVAC_SOURCE_PATH_OVERRIDE := $(patsubst %, %/$(TEXT_PKG), $(TEXT_SRCDIR)), \ INCLUDES := $(TEXT_PKG), \ INCLUDE_FILES := $(TEXT_SOURCES), \ BIN := $(BREAK_ITERATOR_CLASSES))) diff --git a/jdk/make/gensrc/Gensrc-jdk.jdi.gmk b/jdk/make/gensrc/Gensrc-jdk.jdi.gmk index d71c5dd6177..7c36f4e6999 100644 --- a/jdk/make/gensrc/Gensrc-jdk.jdi.gmk +++ b/jdk/make/gensrc/Gensrc-jdk.jdi.gmk @@ -78,8 +78,13 @@ $(JDK_OUTPUTDIR)/modules/jdk.hotspot.agent/META-INF/services/com.sun.jdi.connect $(SUPPORT_OUTPUTDIR)/gensrc/jdk.jdi/META-INF/services/com.sun.jdi.connect.Connector $(install-file) -GENSRC_JDK_JDI += $(SUPPORT_OUTPUTDIR)/gensrc/jdk.jdi/META-INF/services/com.sun.jdi.connect.Connector \ - $(JDK_OUTPUTDIR)/modules/jdk.hotspot.agent/META-INF/services/com.sun.jdi.connect.Connector +# Some platforms don't have the serviceability agent +ifeq (, $(filter $(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU), aix-ppc64)) + ifneq ($(JVM_VARIANT_ZERO), true) + GENSRC_JDK_JDI += $(SUPPORT_OUTPUTDIR)/gensrc/jdk.jdi/META-INF/services/com.sun.jdi.connect.Connector \ + $(JDK_OUTPUTDIR)/modules/jdk.hotspot.agent/META-INF/services/com.sun.jdi.connect.Connector + endif +endif ################################################################################ diff --git a/jdk/make/launcher/LauncherCommon.gmk b/jdk/make/launcher/LauncherCommon.gmk index da91a549a41..09ffcffdb34 100644 --- a/jdk/make/launcher/LauncherCommon.gmk +++ b/jdk/make/launcher/LauncherCommon.gmk @@ -116,7 +116,7 @@ define SetupLauncher endif ifeq ($(OPENJDK_TARGET_OS), aix) - $1_LDFLAGS_SUFFIX += -L$(SUPPORT_OUTPUTDIR)/native/$(MODULE) -ljli_static + $1_LDFLAGS_SUFFIX += -L$(SUPPORT_OUTPUTDIR)/native/java.base -ljli_static endif ifeq ($(USE_EXTERNAL_LIBZ), true) diff --git a/jdk/make/lib/Awt2dLibraries.gmk b/jdk/make/lib/Awt2dLibraries.gmk index 08253f6d660..d4b1e8ce017 100644 --- a/jdk/make/lib/Awt2dLibraries.gmk +++ b/jdk/make/lib/Awt2dLibraries.gmk @@ -367,7 +367,7 @@ ifeq ($(findstring $(OPENJDK_TARGET_OS),windows macosx),) $(X_LIBS) $(LIBAWT_XAWT_LDFLAGS) \ $(call SET_SHARED_LIBRARY_ORIGIN) \ $(call SET_SHARED_LIBRARY_ORIGIN,/..) \ - -L $(INSTALL_LIBRARIES_HERE), \ + -L$(INSTALL_LIBRARIES_HERE), \ LDFLAGS_SUFFIX := $(LIBAWT_XAWT_LDFLAGS_SUFFIX), \ VERSIONINFO_RESOURCE := $(GLOBAL_VERSION_INFO_RESOURCE), \ RC_FLAGS := $(RC_FLAGS) \ @@ -421,7 +421,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBLCMS, \ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/liblcms/mapfile-vers, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ - LDFLAGS_unix := -L $(INSTALL_LIBRARIES_HERE), \ + LDFLAGS_unix := -L$(INSTALL_LIBRARIES_HERE), \ LDFLAGS_solaris := /usr/lib$(OPENJDK_TARGET_CPU_ISADIR)/libm.so.2, \ LDFLAGS_windows := $(WIN_AWT_LIB) $(WIN_JAVA_LIB), \ LDFLAGS_SUFFIX_solaris := -lawt -ljava -ljvm -lc $(LCMS_LIBS), \ @@ -581,7 +581,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBFONTMANAGER, \ MAPFILE := $(BUILD_LIBFONTMANAGER_MAPFILE), \ LDFLAGS := $(subst -Xlinker -z -Xlinker defs,,$(LDFLAGS_JDKLIB)) $(LDFLAGS_CXX_JDK) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ - LDFLAGS_unix := -L $(INSTALL_LIBRARIES_HERE), \ + LDFLAGS_unix := -L$(INSTALL_LIBRARIES_HERE), \ LDFLAGS_SUFFIX := $(BUILD_LIBFONTMANAGER_FONTLIB), \ LDFLAGS_SUFFIX_linux := -lawt $(LIBM) $(LIBCXX) -ljava -ljvm -lc, \ LDFLAGS_SUFFIX_solaris := $(filter-out -R%, $(X_LIBS)) \ @@ -698,7 +698,7 @@ else # OPENJDK_TARGET_OS not windows MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjawt/mapfile-vers, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ - LDFLAGS_unix := -L $(INSTALL_LIBRARIES_HERE), \ + LDFLAGS_unix := -L$(INSTALL_LIBRARIES_HERE), \ LDFLAGS_solaris := $(X_LIBS), \ LDFLAGS_SUFFIX_linux := $(JAWT_LIBS) $(LDFLAGS_JDKLIB_SUFFIX), \ LDFLAGS_SUFFIX_aix := $(JAWT_LIBS) $(LDFLAGS_JDKLIB_SUFFIX),\ @@ -775,7 +775,7 @@ ifeq ($(BUILD_HEADLESS), true) MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libawt_headless/mapfile-vers, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ - LDFLAGS_unix := -L $(INSTALL_LIBRARIES_HERE), \ + LDFLAGS_unix := -L$(INSTALL_LIBRARIES_HERE), \ LDFLAGS_linux := $(call SET_SHARED_LIBRARY_ORIGIN,/..), \ LDFLAGS_solaris := $(call SET_SHARED_LIBRARY_ORIGIN,/..), \ LDFLAGS_macosx := $(call SET_SHARED_LIBRARY_ORIGIN)., \ @@ -954,7 +954,7 @@ ifeq ($(OPENJDK_TARGET_OS), macosx) $(LIBAWT_LWAWT_CFLAGS), \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN) \ - -L $(INSTALL_LIBRARIES_HERE), \ + -L$(INSTALL_LIBRARIES_HERE), \ LDFLAGS_SUFFIX_macosx := -lawt -lmlib_image -losxapp -ljvm $(LIBM) \ -framework Accelerate \ -framework ApplicationServices \ @@ -1002,7 +1002,7 @@ ifeq ($(OPENJDK_TARGET_OS), macosx) LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN) \ -Xlinker -rpath -Xlinker @loader_path \ - -L $(INSTALL_LIBRARIES_HERE), \ + -L$(INSTALL_LIBRARIES_HERE), \ LDFLAGS_SUFFIX_macosx := -lawt -losxapp -lawt_lwawt \ -framework Cocoa \ -framework Carbon \ diff --git a/jdk/make/lib/Lib-java.instrument.gmk b/jdk/make/lib/Lib-java.instrument.gmk index 9799dadc1f6..4aaec5ce5e2 100644 --- a/jdk/make/lib/Lib-java.instrument.gmk +++ b/jdk/make/lib/Lib-java.instrument.gmk @@ -72,8 +72,8 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBINSTRUMENT, \ -framework Cocoa -framework Security -framework ApplicationServices, \ LDFLAGS_SUFFIX := $(LIBINSTRUMENT_LDFLAGS_SUFFIX), \ LDFLAGS_SUFFIX_macosx := -liconv $(LIBZ), \ - LDFLAGS_SUFFIX_solaris := $(LIBZ) -L $(call FindLibDirForModule, java.base)/jli -ljli $(LIBDL) -lc, \ - LDFLAGS_SUFFIX_linux := $(LIBZ) -L $(call FindLibDirForModule, java.base)/jli -ljli $(LIBDL), \ + LDFLAGS_SUFFIX_solaris := $(LIBZ) -L$(call FindLibDirForModule, java.base)/jli -ljli $(LIBDL) -lc, \ + LDFLAGS_SUFFIX_linux := $(LIBZ) -L$(call FindLibDirForModule, java.base)/jli -ljli $(LIBDL), \ LDFLAGS_SUFFIX_aix := $(LIBZ) -L$(SUPPORT_OUTPUTDIR)/native/java.base -ljli_static $(LIBDL),\ VERSIONINFO_RESOURCE := $(GLOBAL_VERSION_INFO_RESOURCE), \ RC_FLAGS := $(RC_FLAGS) \ diff --git a/jdk/make/lib/LibCommon.gmk b/jdk/make/lib/LibCommon.gmk index e60e4d57d5b..f8eb27a1139 100644 --- a/jdk/make/lib/LibCommon.gmk +++ b/jdk/make/lib/LibCommon.gmk @@ -79,7 +79,9 @@ endif # Param 2 - library name # Param 3 - subdir for library define FindLib - $(call FindLibDirForModule, $(strip $1))$(strip $3)/$(LIBRARY_PREFIX)$(strip $2)$(SHARED_LIBRARY_SUFFIX) +$(strip \ + $(call FindLibDirForModule, $(strip $1))$(strip $3)/$(LIBRARY_PREFIX)$(strip $2)$(SHARED_LIBRARY_SUFFIX) \ +) endef ################################################################################ diff --git a/jdk/make/src/classes/build/tools/module/ImageBuilder.java b/jdk/make/src/classes/build/tools/module/ImageBuilder.java index 9f0da161a8f..e9de90b8e5b 100644 --- a/jdk/make/src/classes/build/tools/module/ImageBuilder.java +++ b/jdk/make/src/classes/build/tools/module/ImageBuilder.java @@ -349,21 +349,6 @@ class ImageBuilder { return (new SimpleResolver(mods, moduleGraph)).resolve(); } - /** - * chmod ugo+x file - */ - private void setExecutable(Path file) { - try { - Set perms = Files.getPosixFilePermissions(file); - perms.add(PosixFilePermission.OWNER_EXECUTE); - perms.add(PosixFilePermission.GROUP_EXECUTE); - perms.add(PosixFilePermission.OTHERS_EXECUTE); - Files.setPosixFilePermissions(file, perms); - } catch (IOException ioe) { - throw new UncheckedIOException(ioe); - } - } - private void createImage() throws IOException { Collection modules = resolve(options.mods); log.print(modules.stream().collect(Collectors.joining(" "))); @@ -377,7 +362,7 @@ class ImageBuilder { .filter(f -> f.getFileName().equals(jspawnhelper)) .findFirst(); if (helper.isPresent()) - setExecutable(helper.get()); + helper.get().toFile().setExecutable(true, false); } private class ImageFileHelper { diff --git a/jdk/make/src/classes/build/tools/module/ModuleArchive.java b/jdk/make/src/classes/build/tools/module/ModuleArchive.java index 41d7ae1c282..f05020b9842 100644 --- a/jdk/make/src/classes/build/tools/module/ModuleArchive.java +++ b/jdk/make/src/classes/build/tools/module/ModuleArchive.java @@ -194,7 +194,7 @@ public class ModuleArchive implements Archive { case CMDS: Path path = destFile("bin", filename); writeEntry(in, path); - path.toFile().setExecutable(true); + path.toFile().setExecutable(true, false); break; case CONFIGS: writeEntry(in, destFile("conf", filename)); diff --git a/jdk/src/java.base/macosx/native/libjli/java_md_macosx.c b/jdk/src/java.base/macosx/native/libjli/java_md_macosx.c index 4fa1e4b2855..802d8742dee 100644 --- a/jdk/src/java.base/macosx/native/libjli/java_md_macosx.c +++ b/jdk/src/java.base/macosx/native/libjli/java_md_macosx.c @@ -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,6 @@ #include #include "manifest_info.h" -#include "version_comp.h" /* Support Cocoa event loop on the main thread */ #include @@ -104,10 +103,6 @@ struct NSAppArgs { * (incoming argv) * | * \|/ - * SelectVersion - * (selects the JRE version, note: not data model) - * | - * \|/ * CreateExecutionEnvironment * (determines desired data model) * | diff --git a/jdk/src/java.base/share/classes/java/lang/String.java b/jdk/src/java.base/share/classes/java/lang/String.java index 92d381b3259..a44682a5b44 100644 --- a/jdk/src/java.base/share/classes/java/lang/String.java +++ b/jdk/src/java.base/share/classes/java/lang/String.java @@ -184,8 +184,8 @@ public final class String * The length * * @throws IndexOutOfBoundsException - * If the {@code offset} and {@code count} arguments index - * characters outside the bounds of the {@code value} array + * If {@code offset} is negative, {@code count} is negative, or + * {@code offset} is greater than {@code value.length - count} */ public String(char value[], int offset, int count) { if (offset < 0) { @@ -224,8 +224,8 @@ public final class String * codePoints} * * @throws IndexOutOfBoundsException - * If the {@code offset} and {@code count} arguments index - * characters outside the bounds of the {@code codePoints} array + * If {@code offset} is negative, {@code count} is negative, or + * {@code offset} is greater than {@code codePoints.length - count} * * @since 1.5 */ @@ -297,7 +297,8 @@ public final class String * The length * * @throws IndexOutOfBoundsException - * If the {@code offset} or {@code count} argument is invalid + * If {@code offset} is negative, {@code count} is negative, or + * {@code offset} is greater than {@code ascii.length - count} * * @see #String(byte[], int) * @see #String(byte[], int, int, java.lang.String) @@ -401,8 +402,8 @@ public final class String * If the named charset is not supported * * @throws IndexOutOfBoundsException - * If the {@code offset} and {@code length} arguments index - * characters outside the bounds of the {@code bytes} array + * If {@code offset} is negative, {@code length} is negative, or + * {@code offset} is greater than {@code bytes.length - length} * * @since 1.1 */ @@ -439,8 +440,8 @@ public final class String * decode the {@code bytes} * * @throws IndexOutOfBoundsException - * If the {@code offset} and {@code length} arguments index - * characters outside the bounds of the {@code bytes} array + * If {@code offset} is negative, {@code length} is negative, or + * {@code offset} is greater than {@code bytes.length - length} * * @since 1.6 */ @@ -524,8 +525,8 @@ public final class String * The number of bytes to decode * * @throws IndexOutOfBoundsException - * If the {@code offset} and the {@code length} arguments index - * characters outside the bounds of the {@code bytes} array + * If {@code offset} is negative, {@code length} is negative, or + * {@code offset} is greater than {@code bytes.length - length} * * @since 1.1 */ diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java index 0fe5a897417..eda6a6d27df 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java @@ -2028,7 +2028,7 @@ return invoker; MethodType oldType = target.type(); if (oldType == newType) return target; if (oldType.explicitCastEquivalentToAsType(newType)) { - return target.asType(newType); + return target.asFixedArity().asType(newType); } return MethodHandleImpl.makePairwiseConvert(target, newType, false); } diff --git a/jdk/src/java.base/share/classes/java/nio/channels/Channels.java b/jdk/src/java.base/share/classes/java/nio/channels/Channels.java index 2ab10fa2f7a..1325374755f 100644 --- a/jdk/src/java.base/share/classes/java/nio/channels/Channels.java +++ b/jdk/src/java.base/share/classes/java/nio/channels/Channels.java @@ -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 @@ -38,6 +38,7 @@ import java.nio.charset.CharsetDecoder; import java.nio.charset.CharsetEncoder; import java.nio.charset.UnsupportedCharsetException; import java.nio.channels.spi.AbstractInterruptibleChannel; +import java.util.Objects; import java.util.concurrent.ExecutionException; import sun.nio.ch.ChannelInputStream; import sun.nio.cs.StreamDecoder; @@ -48,8 +49,8 @@ import sun.nio.cs.StreamEncoder; * Utility methods for channels and streams. * *

This class defines static methods that support the interoperation of the - * stream classes of the {@link java.io} package with the channel - * classes of this package.

+ * stream classes of the {@link java.io} package with the channel classes + * of this package.

* * * @author Mark Reinhold @@ -60,12 +61,7 @@ import sun.nio.cs.StreamEncoder; public final class Channels { - private Channels() { } // No instantiation - - private static void checkNotNull(Object o, String name) { - if (o == null) - throw new NullPointerException("\"" + name + "\" is null!"); - } + private Channels() { throw new Error("no instances"); } /** * Write all remaining bytes in buffer to the given channel. @@ -91,7 +87,7 @@ public final class Channels { throws IOException { if (ch instanceof SelectableChannel) { - SelectableChannel sc = (SelectableChannel)ch; + SelectableChannel sc = (SelectableChannel) ch; synchronized (sc.blockingLock()) { if (!sc.isBlocking()) throw new IllegalBlockingModeException(); @@ -107,7 +103,7 @@ public final class Channels { /** * Constructs a stream that reads bytes from the given channel. * - *

The read methods of the resulting stream will throw an + *

The {@code read} methods of the resulting stream will throw an * {@link IllegalBlockingModeException} if invoked while the underlying * channel is in non-blocking mode. The stream will not be buffered, and * it will not support the {@link InputStream#mark mark} or {@link @@ -121,14 +117,14 @@ public final class Channels { * @return A new input stream */ public static InputStream newInputStream(ReadableByteChannel ch) { - checkNotNull(ch, "ch"); - return new sun.nio.ch.ChannelInputStream(ch); + Objects.requireNonNull(ch, "ch"); + return new ChannelInputStream(ch); } /** * Constructs a stream that writes bytes to the given channel. * - *

The write methods of the resulting stream will throw an + *

The {@code write} methods of the resulting stream will throw an * {@link IllegalBlockingModeException} if invoked while the underlying * channel is in non-blocking mode. The stream will not be buffered. The * stream will be safe for access by multiple concurrent threads. Closing @@ -139,46 +135,49 @@ public final class Channels { * * @return A new output stream */ - public static OutputStream newOutputStream(final WritableByteChannel ch) { - checkNotNull(ch, "ch"); + public static OutputStream newOutputStream(WritableByteChannel ch) { + Objects.requireNonNull(ch, "ch"); return new OutputStream() { - private ByteBuffer bb = null; - private byte[] bs = null; // Invoker's previous array - private byte[] b1 = null; + private ByteBuffer bb; + private byte[] bs; // Invoker's previous array + private byte[] b1; - public synchronized void write(int b) throws IOException { - if (b1 == null) - b1 = new byte[1]; - b1[0] = (byte)b; - this.write(b1); - } + @Override + public synchronized void write(int b) throws IOException { + if (b1 == null) + b1 = new byte[1]; + b1[0] = (byte) b; + this.write(b1); + } - public synchronized void write(byte[] bs, int off, int len) + @Override + public synchronized void write(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; - } - ByteBuffer bb = ((this.bs == bs) - ? this.bb - : ByteBuffer.wrap(bs)); - bb.limit(Math.min(off + len, bb.capacity())); - bb.position(off); - this.bb = bb; - this.bs = bs; - Channels.writeFully(ch, bb); + { + if ((off < 0) || (off > bs.length) || (len < 0) || + ((off + len) > bs.length) || ((off + len) < 0)) { + throw new IndexOutOfBoundsException(); + } else if (len == 0) { + return; } + ByteBuffer bb = ((this.bs == bs) + ? this.bb + : ByteBuffer.wrap(bs)); + bb.limit(Math.min(off + len, bb.capacity())); + bb.position(off); + this.bb = bb; + this.bs = bs; + Channels.writeFully(ch, bb); + } - public void close() throws IOException { - ch.close(); - } + @Override + public void close() throws IOException { + ch.close(); + } - }; + }; } /** @@ -196,13 +195,13 @@ public final class Channels { * * @since 1.7 */ - public static InputStream newInputStream(final AsynchronousByteChannel ch) { - checkNotNull(ch, "ch"); + public static InputStream newInputStream(AsynchronousByteChannel ch) { + Objects.requireNonNull(ch, "ch"); return new InputStream() { - private ByteBuffer bb = null; - private byte[] bs = null; // Invoker's previous array - private byte[] b1 = null; + private ByteBuffer bb; + private byte[] bs; // Invoker's previous array + private byte[] b1; @Override public synchronized int read() throws IOException { @@ -216,13 +215,14 @@ public final class Channels { @Override public synchronized int read(byte[] bs, int off, int len) - throws IOException + throws IOException { if ((off < 0) || (off > bs.length) || (len < 0) || ((off + len) > bs.length) || ((off + len) < 0)) { throw new IndexOutOfBoundsException(); - } else if (len == 0) + } else if (len == 0) { return 0; + } ByteBuffer bb = ((this.bs == bs) ? this.bb @@ -270,25 +270,25 @@ public final class Channels { * * @since 1.7 */ - public static OutputStream newOutputStream(final AsynchronousByteChannel ch) { - checkNotNull(ch, "ch"); + public static OutputStream newOutputStream(AsynchronousByteChannel ch) { + Objects.requireNonNull(ch, "ch"); return new OutputStream() { - private ByteBuffer bb = null; - private byte[] bs = null; // Invoker's previous array - private byte[] b1 = null; + private ByteBuffer bb; + private byte[] bs; // Invoker's previous array + private byte[] b1; @Override public synchronized void write(int b) throws IOException { - if (b1 == null) + if (b1 == null) b1 = new byte[1]; - b1[0] = (byte)b; + b1[0] = (byte) b; this.write(b1); } @Override public synchronized void write(byte[] bs, int off, int len) - throws IOException + throws IOException { if ((off < 0) || (off > bs.length) || (len < 0) || ((off + len) > bs.length) || ((off + len) < 0)) { @@ -343,12 +343,11 @@ public final class Channels { * * @return A new readable byte channel */ - public static ReadableByteChannel newChannel(final InputStream in) { - checkNotNull(in, "in"); + public static ReadableByteChannel newChannel(InputStream in) { + Objects.requireNonNull(in, "in"); - if (in instanceof FileInputStream && - FileInputStream.class.equals(in.getClass())) { - return ((FileInputStream)in).getChannel(); + if (in.getClass() == FileInputStream.class) { + return ((FileInputStream) in).getChannel(); } return new ReadableByteChannelImpl(in); @@ -358,16 +357,16 @@ public final class Channels { extends AbstractInterruptibleChannel // Not really interruptible implements ReadableByteChannel { - InputStream in; + private final InputStream in; private static final int TRANSFER_SIZE = 8192; - private byte buf[] = new byte[0]; - private boolean open = true; - private Object readLock = new Object(); + private byte[] buf = new byte[0]; + private final Object readLock = new Object(); ReadableByteChannelImpl(InputStream in) { this.in = in; } + @Override public int read(ByteBuffer dst) throws IOException { int len = dst.remaining(); int totalRead = 0; @@ -399,9 +398,9 @@ public final class Channels { } } + @Override protected void implCloseChannel() throws IOException { in.close(); - open = false; } } @@ -418,12 +417,11 @@ public final class Channels { * * @return A new writable byte channel */ - public static WritableByteChannel newChannel(final OutputStream out) { - checkNotNull(out, "out"); + public static WritableByteChannel newChannel(OutputStream out) { + Objects.requireNonNull(out, "out"); - if (out instanceof FileOutputStream && - FileOutputStream.class.equals(out.getClass())) { - return ((FileOutputStream)out).getChannel(); + if (out.getClass() == FileOutputStream.class) { + return ((FileOutputStream) out).getChannel(); } return new WritableByteChannelImpl(out); @@ -433,16 +431,16 @@ public final class Channels { extends AbstractInterruptibleChannel // Not really interruptible implements WritableByteChannel { - OutputStream out; + private final OutputStream out; private static final int TRANSFER_SIZE = 8192; - private byte buf[] = new byte[0]; - private boolean open = true; - private Object writeLock = new Object(); + private byte[] buf = new byte[0]; + private final Object writeLock = new Object(); WritableByteChannelImpl(OutputStream out) { this.out = out; } + @Override public int write(ByteBuffer src) throws IOException { int len = src.remaining(); int totalWritten = 0; @@ -465,9 +463,9 @@ public final class Channels { } } + @Override protected void implCloseChannel() throws IOException { out.close(); - open = false; } } @@ -479,7 +477,7 @@ public final class Channels { * given decoder. * *

The resulting stream will contain an internal input buffer of at - * least minBufferCap bytes. The stream's read methods + * least {@code minBufferCap} bytes. The stream's {@code read} methods * will, as needed, fill the buffer by reading bytes from the underlying * channel; if the channel is in non-blocking mode when bytes are to be * read then an {@link IllegalBlockingModeException} will be thrown. The @@ -495,7 +493,7 @@ public final class Channels { * * @param minBufferCap * The minimum capacity of the internal byte buffer, - * or -1 if an implementation-dependent + * or {@code -1} if an implementation-dependent * default capacity is to be used * * @return A new reader @@ -504,7 +502,7 @@ public final class Channels { CharsetDecoder dec, int minBufferCap) { - checkNotNull(ch, "ch"); + Objects.requireNonNull(ch, "ch"); return StreamDecoder.forDecoder(ch, dec.reset(), minBufferCap); } @@ -514,16 +512,15 @@ public final class Channels { * *

An invocation of this method of the form * - *

-     * Channels.newReader(ch, csname)
+ *
 {@code
+     *     Channels.newReader(ch, csname)
+     * } 
* * behaves in exactly the same way as the expression * - *
-     * Channels.newReader(ch,
-     *                    Charset.forName(csName)
-     *                        .newDecoder(),
-     *                    -1);
+ *
 {@code
+     *     Channels.newReader(ch, Charset.forName(csName).newDecoder(), -1)
+     * } 
* * @param ch * The channel from which bytes will be read @@ -540,7 +537,7 @@ public final class Channels { public static Reader newReader(ReadableByteChannel ch, String csName) { - checkNotNull(csName, "csName"); + Objects.requireNonNull(csName, "csName"); return newReader(ch, Charset.forName(csName).newDecoder(), -1); } @@ -549,7 +546,7 @@ public final class Channels { * writes the resulting bytes to the given channel. * *

The resulting stream will contain an internal output buffer of at - * least minBufferCap bytes. The stream's write methods + * least {@code minBufferCap} bytes. The stream's {@code write} methods * will, as needed, flush the buffer by writing bytes to the underlying * channel; if the channel is in non-blocking mode when bytes are to be * written then an {@link IllegalBlockingModeException} will be thrown. @@ -564,16 +561,16 @@ public final class Channels { * * @param minBufferCap * The minimum capacity of the internal byte buffer, - * or -1 if an implementation-dependent + * or {@code -1} if an implementation-dependent * default capacity is to be used * * @return A new writer */ - public static Writer newWriter(final WritableByteChannel ch, - final CharsetEncoder enc, - final int minBufferCap) + public static Writer newWriter(WritableByteChannel ch, + CharsetEncoder enc, + int minBufferCap) { - checkNotNull(ch, "ch"); + Objects.requireNonNull(ch, "ch"); return StreamEncoder.forEncoder(ch, enc.reset(), minBufferCap); } @@ -582,17 +579,15 @@ public final class Channels { * charset and writes the resulting bytes to the given channel. * *

An invocation of this method of the form - * - *

-     * Channels.newWriter(ch, csname)
- * + *

+ *

 {@code
+     *     Channels.newWriter(ch, csname)
+     * } 
* behaves in exactly the same way as the expression - * - *
-     * Channels.newWriter(ch,
-     *                    Charset.forName(csName)
-     *                        .newEncoder(),
-     *                    -1);
+ *

+ *

 {@code
+     *     Channels.newWriter(ch, Charset.forName(csName).newEncoder(), -1)
+     * } 
* * @param ch * The channel to which bytes will be written @@ -609,7 +604,7 @@ public final class Channels { public static Writer newWriter(WritableByteChannel ch, String csName) { - checkNotNull(csName, "csName"); + Objects.requireNonNull(csName, "csName"); return newWriter(ch, Charset.forName(csName).newEncoder(), -1); } } diff --git a/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java b/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java index f8bd9a90b59..601b019e886 100644 --- a/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java +++ b/jdk/src/java.base/share/classes/java/text/ChoiceFormat.java @@ -272,7 +272,7 @@ public class ChoiceFormat extends NumberFormat { double tryLess = Math.abs(Math.IEEEremainder(less, 1.0d)); if (tryLessOrEqual < tryLess) { - result.append(""+choiceLimits[i]); + result.append(choiceLimits[i]); result.append('#'); } else { if (choiceLimits[i] == Double.POSITIVE_INFINITY) { @@ -280,7 +280,7 @@ public class ChoiceFormat extends NumberFormat { } else if (choiceLimits[i] == Double.NEGATIVE_INFINITY) { result.append("-\u221E"); } else { - result.append(""+less); + result.append(less); } result.append('<'); } diff --git a/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java b/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java index 62c1b19b4c4..456c8120b71 100644 --- a/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java +++ b/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java @@ -369,10 +369,9 @@ public enum LauncherHelper { static void appendVmErgoMessage(boolean isServerClass, String vm) { outBuf = outBuf.append(getLocalizedMessage("java.launcher.ergo.message1", vm)); - outBuf = (isServerClass) - ? outBuf.append(",\n" + - getLocalizedMessage("java.launcher.ergo.message2") + "\n\n") - : outBuf.append(".\n\n"); + outBuf = (isServerClass) ? outBuf.append(",\n") + .append(getLocalizedMessage("java.launcher.ergo.message2")) + .append("\n\n") : outBuf.append(".\n\n"); } /** diff --git a/jdk/src/java.base/share/classes/sun/net/www/HeaderParser.java b/jdk/src/java.base/share/classes/sun/net/www/HeaderParser.java index 3f1629fa8c6..f9db1df64de 100644 --- a/jdk/src/java.base/share/classes/sun/net/www/HeaderParser.java +++ b/jdk/src/java.base/share/classes/sun/net/www/HeaderParser.java @@ -220,21 +220,23 @@ public class HeaderParser { public String toString () { Iterator k = keys(); - StringBuffer sbuf = new StringBuffer(); - sbuf.append ("{size="+asize+" nkeys="+nkeys+" "); + StringBuilder sb = new StringBuilder(); + sb.append("{size=").append(asize).append(" nkeys=").append(nkeys) + .append(' '); for (int i=0; k.hasNext(); i++) { String key = k.next(); String val = findValue (i); if (val != null && "".equals (val)) { val = null; } - sbuf.append (" {"+key+(val==null?"":","+val)+"}"); + sb.append(" {").append(key).append(val == null ? "" : "," + val) + .append('}'); if (k.hasNext()) { - sbuf.append (","); + sb.append (','); } } - sbuf.append (" }"); - return new String (sbuf); + sb.append (" }"); + return sb.toString(); } public int findInt(String k, int Default) { diff --git a/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java b/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java index 2c3102feadd..8f18d44d63e 100644 --- a/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java +++ b/jdk/src/java.base/share/classes/sun/nio/ch/FileChannelImpl.java @@ -38,6 +38,7 @@ import java.nio.channels.NonReadableChannelException; import java.nio.channels.NonWritableChannelException; import java.nio.channels.OverlappingFileLockException; import java.nio.channels.ReadableByteChannel; +import java.nio.channels.SelectableChannel; import java.nio.channels.WritableByteChannel; import java.security.AccessController; import java.util.ArrayList; @@ -404,30 +405,13 @@ public class FileChannelImpl // private static volatile boolean fileSupported = true; - private long transferToDirectly(long position, int icount, - WritableByteChannel target) + private long transferToDirectlyInternal(long position, int icount, + WritableByteChannel target, + FileDescriptor targetFD) throws IOException { - if (!transferSupported) - return IOStatus.UNSUPPORTED; - - FileDescriptor targetFD = null; - if (target instanceof FileChannelImpl) { - if (!fileSupported) - return IOStatus.UNSUPPORTED_CASE; - targetFD = ((FileChannelImpl)target).fd; - } else if (target instanceof SelChImpl) { - // Direct transfer to pipe causes EINVAL on some configurations - if ((target instanceof SinkChannelImpl) && !pipeSupported) - return IOStatus.UNSUPPORTED_CASE; - targetFD = ((SelChImpl)target).getFD(); - } - if (targetFD == null) - return IOStatus.UNSUPPORTED; - int thisFDVal = IOUtil.fdVal(fd); - int targetFDVal = IOUtil.fdVal(targetFD); - if (thisFDVal == targetFDVal) // Not supported on some configurations - return IOStatus.UNSUPPORTED; + assert !nd.transferToDirectlyNeedsPositionLock() || + Thread.holdsLock(positionLock); long n = -1; int ti = -1; @@ -437,7 +421,7 @@ public class FileChannelImpl if (!isOpen()) return -1; do { - n = transferTo0(thisFDVal, position, icount, targetFDVal); + n = transferTo0(fd, position, icount, targetFD); } while ((n == IOStatus.INTERRUPTED) && isOpen()); if (n == IOStatus.UNSUPPORTED_CASE) { if (target instanceof SinkChannelImpl) @@ -458,6 +442,54 @@ public class FileChannelImpl } } + private long transferToDirectly(long position, int icount, + WritableByteChannel target) + throws IOException + { + if (!transferSupported) + return IOStatus.UNSUPPORTED; + + FileDescriptor targetFD = null; + if (target instanceof FileChannelImpl) { + if (!fileSupported) + return IOStatus.UNSUPPORTED_CASE; + targetFD = ((FileChannelImpl)target).fd; + } else if (target instanceof SelChImpl) { + // Direct transfer to pipe causes EINVAL on some configurations + if ((target instanceof SinkChannelImpl) && !pipeSupported) + return IOStatus.UNSUPPORTED_CASE; + + // Platform-specific restrictions. Now there is only one: + // Direct transfer to non-blocking channel could be forbidden + SelectableChannel sc = (SelectableChannel)target; + if (!nd.canTransferToDirectly(sc)) + return IOStatus.UNSUPPORTED_CASE; + + targetFD = ((SelChImpl)target).getFD(); + } + + if (targetFD == null) + return IOStatus.UNSUPPORTED; + int thisFDVal = IOUtil.fdVal(fd); + int targetFDVal = IOUtil.fdVal(targetFD); + if (thisFDVal == targetFDVal) // Not supported on some configurations + return IOStatus.UNSUPPORTED; + + if (nd.transferToDirectlyNeedsPositionLock()) { + synchronized (positionLock) { + long pos = position(); + try { + return transferToDirectlyInternal(position, icount, + target, targetFD); + } finally { + position(pos); + } + } + } else { + return transferToDirectlyInternal(position, icount, target, targetFD); + } + } + // Maximum size to map when using a mapped buffer private static final long MAPPED_TRANSFER_SIZE = 8L*1024L*1024L; @@ -1173,7 +1205,8 @@ public class FileChannelImpl private static native int unmap0(long address, long length); // Transfers from src to dst, or returns -2 if kernel can't do that - private native long transferTo0(int src, long position, long count, int dst); + private native long transferTo0(FileDescriptor src, long position, + long count, FileDescriptor dst); // Sets or reports this file's position // If offset is -1, the current position is returned diff --git a/jdk/src/java.base/share/classes/sun/nio/ch/FileDispatcher.java b/jdk/src/java.base/share/classes/sun/nio/ch/FileDispatcher.java index 6e5df225080..5e9f82fc037 100644 --- a/jdk/src/java.base/share/classes/sun/nio/ch/FileDispatcher.java +++ b/jdk/src/java.base/share/classes/sun/nio/ch/FileDispatcher.java @@ -25,7 +25,9 @@ package sun.nio.ch; -import java.io.*; +import java.io.FileDescriptor; +import java.io.IOException; +import java.nio.channels.SelectableChannel; abstract class FileDispatcher extends NativeDispatcher { @@ -53,4 +55,8 @@ abstract class FileDispatcher extends NativeDispatcher { */ abstract FileDescriptor duplicateForMapping(FileDescriptor fd) throws IOException; + + abstract boolean canTransferToDirectly(SelectableChannel sc); + + abstract boolean transferToDirectlyNeedsPositionLock(); } diff --git a/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java b/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java index c7257e52e9c..972f540940c 100644 --- a/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java +++ b/jdk/src/java.base/share/classes/sun/security/ssl/HandshakeMessage.java @@ -1478,7 +1478,7 @@ class CertificateRequest extends HandshakeMessage boolean opened = false; for (SignatureAndHashAlgorithm signAlg : algorithms) { if (opened) { - sb.append(", " + signAlg.getAlgorithmName()); + sb.append(", ").append(signAlg.getAlgorithmName()); } else { sb.append(signAlg.getAlgorithmName()); opened = true; diff --git a/jdk/src/java.base/share/native/libjli/emessages.h b/jdk/src/java.base/share/native/libjli/emessages.h index e390c71b49b..961ff7be3f7 100644 --- a/jdk/src/java.base/share/native/libjli/emessages.h +++ b/jdk/src/java.base/share/native/libjli/emessages.h @@ -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 @@ -72,9 +72,6 @@ #define CFG_ERROR8 "Error: missing `%s' JVM at `%s'.\nPlease install or use the JRE or JDK that contains these missing components." #define CFG_ERROR9 "Error: could not determine JVM type." - -#define SPC_ERROR1 "Error: Syntax error in version specification \"%s\"" - #define JRE_ERROR1 "Error: Could not find Java SE Runtime Environment." #define JRE_ERROR2 "Error: This Java instance does not support a %d-bit JVM.\nPlease install the desired version." #define JRE_ERROR3 "Error: Improper value at line %d." @@ -89,6 +86,9 @@ #define JRE_ERROR12 "Error: Exec of %s failed" #define JRE_ERROR13 "Error: String processing operation failed" +#define SPC_ERROR1 "Error: Specifying an alternate JDK/JRE version is no longer supported.\n The use of the flag '-version:' is no longer valid.\n Please download and execute the appropriate version." +#define SPC_ERROR2 "Error: Specifying an alternate JDK/JRE is no longer supported.\n The related flags -jre-restrict-search | -jre-no-restrict-search are also no longer valid." + #define DLL_ERROR1 "Error: dl failure on line %d" #define DLL_ERROR2 "Error: failed %s, because %s" #define DLL_ERROR3 "Error: could not find executable %s" diff --git a/jdk/src/java.base/share/native/libjli/java.c b/jdk/src/java.base/share/native/libjli/java.c index c71f4c26fab..becd6cbf749 100644 --- a/jdk/src/java.base/share/native/libjli/java.c +++ b/jdk/src/java.base/share/native/libjli/java.c @@ -216,21 +216,14 @@ JLI_Launch(int argc, char ** argv, /* main argc, argc */ } /* - * Make sure the specified version of the JRE is running. + * SelectVersion() has several responsibilities: * - * There are three things to note about the SelectVersion() routine: - * 1) If the version running isn't correct, this routine doesn't - * return (either the correct version has been exec'd or an error - * was issued). - * 2) Argc and Argv in this scope are *not* altered by this routine. - * It is the responsibility of subsequent code to ignore the - * arguments handled by this routine. - * 3) As a side-effect, the variable "main_class" is guaranteed to - * be set (if it should ever be set). This isn't exactly the - * poster child for structured programming, but it is a small - * price to pay for not processing a jar file operand twice. - * (Note: This side effect has been disabled. See comment on - * bugid 5030265 below.) + * 1) Disallow specification of another JRE. With 1.9, another + * version of the JRE cannot be invoked. + * 2) Allow for a JRE version to invoke JDK 1.9 or later. Since + * all mJRE directives have been stripped from the request but + * the pre 1.9 JRE [ 1.6 thru 1.8 ], it is as if 1.9+ has been + * invoked from the command line. */ SelectVersion(argc, argv, &main_class); @@ -829,8 +822,6 @@ static void SelectVersion(int argc, char **argv, char **main_class) { char *arg; - char **new_argv; - char **new_argp; char *operand; char *version = NULL; char *jre = NULL; @@ -849,6 +840,17 @@ SelectVersion(int argc, char **argv, char **main_class) * with the value passed through the environment (if any) and * simply return. */ + + /* + * This environmental variable can be set by mJRE capable JREs + * [ 1.5 thru 1.8 ]. All other aspects of mJRE processing have been + * stripped by those JREs. This environmental variable allows 1.9+ + * JREs to be started by these mJRE capable JREs. + * Note that mJRE directives in the jar manifest file would have been + * ignored for a JRE started by another JRE... + * .. skipped for JRE 1.5 and beyond. + * .. not even checked for pre 1.5. + */ if ((env_in = getenv(ENV_ENTRY)) != NULL) { if (*env_in != '\0') *main_class = JLI_StringDup(env_in); @@ -857,41 +859,26 @@ SelectVersion(int argc, char **argv, char **main_class) /* * Scan through the arguments for options relevant to multiple JRE - * support. For reference, the command line syntax is defined as: + * support. Multiple JRE support existed in JRE versions 1.5 thru 1.8. * - * SYNOPSIS - * java [options] class [argument...] - * - * java [options] -jar file.jar [argument...] - * - * As the scan is performed, make a copy of the argument list with - * the version specification options (new to 1.5) removed, so that - * a version less than 1.5 can be exec'd. - * - * Note that due to the syntax of the native Windows interface - * CreateProcess(), processing similar to the following exists in - * the Windows platform specific routine ExecJRE (in java_md.c). - * Changes here should be reproduced there. + * This capability is no longer available with JRE versions 1.9 and later. + * These command line options are reported as errors. */ - new_argv = JLI_MemAlloc((argc + 1) * sizeof(char*)); - new_argv[0] = argv[0]; - new_argp = &new_argv[1]; argc--; argv++; while ((arg = *argv) != 0 && *arg == '-') { if (JLI_StrCCmp(arg, "-version:") == 0) { - version = arg + 9; + JLI_ReportErrorMessage(SPC_ERROR1); } else if (JLI_StrCmp(arg, "-jre-restrict-search") == 0) { - restrict_search = 1; - } else if (JLI_StrCmp(arg, "-no-jre-restrict-search") == 0) { - restrict_search = 0; + JLI_ReportErrorMessage(SPC_ERROR2); + } else if (JLI_StrCmp(arg, "-jre-no-restrict-search") == 0) { + JLI_ReportErrorMessage(SPC_ERROR2); } else { if (JLI_StrCmp(arg, "-jar") == 0) jarflag = 1; /* deal with "unfortunate" classpath syntax */ if ((JLI_StrCmp(arg, "-classpath") == 0 || JLI_StrCmp(arg, "-cp") == 0) && (argc >= 2)) { - *new_argp++ = arg; argc--; argv++; arg = *argv; @@ -908,7 +895,6 @@ SelectVersion(int argc, char **argv, char **main_class) } else if (JLI_StrCCmp(arg, "-splash:") == 0) { splash_file_name = arg+8; } - *new_argp++ = arg; } argc--; argv++; @@ -917,11 +903,8 @@ SelectVersion(int argc, char **argv, char **main_class) operand = NULL; } else { argc--; - *new_argp++ = operand = *argv++; + operand = *argv++; } - while (argc-- > 0) /* Copy over [argument...] */ - *new_argp++ = *argv++; - *new_argp = NULL; /* * If there is a jar file, read the manifest. If the jarfile can't be @@ -974,14 +957,6 @@ SelectVersion(int argc, char **argv, char **main_class) putenv(splash_jar_entry); } - /* - * The JRE-Version and JRE-Restrict-Search values (if any) from the - * manifest are overwritten by any specified on the command line. - */ - if (version != NULL) - info.jre_version = version; - if (restrict_search != -1) - info.jre_restrict_search = restrict_search; /* * "Valid" returns (other than unrecoverable errors) follow. Set @@ -990,72 +965,11 @@ SelectVersion(int argc, char **argv, char **main_class) if (info.main_class != NULL) *main_class = JLI_StringDup(info.main_class); - /* - * If no version selection information is found either on the command - * line or in the manifest, simply return. - */ if (info.jre_version == NULL) { JLI_FreeManifest(); - JLI_MemFree(new_argv); return; } - /* - * Check for correct syntax of the version specification (JSR 56). - */ - if (!JLI_ValidVersionString(info.jre_version)) { - JLI_ReportErrorMessage(SPC_ERROR1, info.jre_version); - exit(1); - } - - /* - * Find the appropriate JVM on the system. Just to be as forgiving as - * possible, if the standard algorithms don't locate an appropriate - * jre, check to see if the one running will satisfy the requirements. - * This can happen on systems which haven't been set-up for multiple - * JRE support. - */ - jre = LocateJRE(&info); - JLI_TraceLauncher("JRE-Version = %s, JRE-Restrict-Search = %s Selected = %s\n", - (info.jre_version?info.jre_version:"null"), - (info.jre_restrict_search?"true":"false"), (jre?jre:"null")); - - if (jre == NULL) { - if (JLI_AcceptableRelease(GetFullVersion(), info.jre_version)) { - JLI_FreeManifest(); - JLI_MemFree(new_argv); - return; - } else { - JLI_ReportErrorMessage(CFG_ERROR4, info.jre_version); - exit(1); - } - } - - /* - * If I'm not the chosen one, exec the chosen one. Returning from - * ExecJRE indicates that I am indeed the chosen one. - * - * The private environment variable _JAVA_VERSION_SET is used to - * prevent the chosen one from re-reading the manifest file and - * using the values found within to override the (potential) command - * line flags stripped from argv (because the target may not - * understand them). Passing the MainClass value is an optimization - * to avoid locating, expanding and parsing the manifest extra - * times. - */ - if (info.main_class != NULL) { - if (JLI_StrLen(info.main_class) <= MAXNAMELEN) { - (void)JLI_StrCat(env_entry, info.main_class); - } else { - JLI_ReportErrorMessage(CLS_ERROR5, MAXNAMELEN); - exit(1); - } - } - (void)putenv(env_entry); - ExecJRE(jre, new_argv); - JLI_FreeManifest(); - JLI_MemFree(new_argv); - return; } /* @@ -1154,10 +1068,7 @@ ParseArguments(int *pargc, char ***pargv, JLI_StrCmp(arg, "-noasyncgc") == 0) { /* No longer supported */ JLI_ReportErrorMessage(ARG_WARN, arg); - } else if (JLI_StrCCmp(arg, "-version:") == 0 || - JLI_StrCmp(arg, "-no-jre-restrict-search") == 0 || - JLI_StrCmp(arg, "-jre-restrict-search") == 0 || - JLI_StrCCmp(arg, "-splash:") == 0) { + } else if (JLI_StrCCmp(arg, "-splash:") == 0) { ; /* Ignore machine independent options already handled */ } else if (ProcessPlatformOption(arg)) { ; /* Processing of platform dependent options */ diff --git a/jdk/src/java.base/share/native/libjli/java.h b/jdk/src/java.base/share/native/libjli/java.h index 83e97e60d9c..615b16cd9c3 100644 --- a/jdk/src/java.base/share/native/libjli/java.h +++ b/jdk/src/java.base/share/native/libjli/java.h @@ -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 @@ -40,9 +40,7 @@ #include "emessages.h" #include "java_md.h" #include "jli_util.h" - #include "manifest_info.h" -#include "version_comp.h" #include "wildcard.h" #include "splashscreen.h" diff --git a/jdk/src/java.base/share/native/libjli/parse_manifest.c b/jdk/src/java.base/share/native/libjli/parse_manifest.c index c17249c0b30..a8e17b89b25 100644 --- a/jdk/src/java.base/share/native/libjli/parse_manifest.c +++ b/jdk/src/java.base/share/native/libjli/parse_manifest.c @@ -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 @@ -588,15 +588,16 @@ JLI_ParseManifest(char *jarfile, manifest_info *info) } lp = manifest; while ((rc = parse_nv_pair(&lp, &name, &value)) > 0) { - if (JLI_StrCaseCmp(name, "Manifest-Version") == 0) + if (JLI_StrCaseCmp(name, "Manifest-Version") == 0) { info->manifest_version = value; - else if (JLI_StrCaseCmp(name, "Main-Class") == 0) + } else if (JLI_StrCaseCmp(name, "Main-Class") == 0) { info->main_class = value; - else if (JLI_StrCaseCmp(name, "JRE-Version") == 0) - info->jre_version = value; - else if (JLI_StrCaseCmp(name, "JRE-Restrict-Search") == 0) { - if (JLI_StrCaseCmp(value, "true") == 0) - info->jre_restrict_search = 1; + } else if (JLI_StrCaseCmp(name, "JRE-Version") == 0) { + /* + * Manifest specification overridden by command line option + * so we will silently override there with no specification. + */ + info->jre_version = 0; } else if (JLI_StrCaseCmp(name, "Splashscreen-Image") == 0) { info->splashscreen_image_file_name = value; } diff --git a/jdk/src/java.base/share/native/libjli/version_comp.c b/jdk/src/java.base/share/native/libjli/version_comp.c deleted file mode 100644 index fc20ba94e9a..00000000000 --- a/jdk/src/java.base/share/native/libjli/version_comp.c +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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 "jli_util.h" -#include "version_comp.h" - -/* - * A collection of useful strings. One should think of these as #define - * entries, but actual strings can be more efficient (with many compilers). - */ -static const char *separators = ".-_"; -static const char *zero_string = "0"; - -/* - * Validate a string as parsable as a "Java int". If so parsable, - * return true (non-zero) and store the numeric value at the address - * passed in as "value"; otherwise return false (zero). - * - * Note that the maximum allowable value is 2147483647 as defined by - * the "Java Language Specification" which precludes the use of native - * conversion routines which may have other limits. - * - * Also note that we don't have to worry about the alternate maximum - * allowable value of 2147483648 because it is only allowed after - * the unary negation operator and this grammar doesn't have one - * of those. - * - * Finally, note that a value which exceeds the maximum jint value will - * return false (zero). This results in the otherwise purely numeric - * string being compared as a string of characters (as per the spec.) - */ -static int -isjavaint(const char *s, jint *value) -{ - jlong sum = 0; - jint digit; - while (*s != '\0') - if (isdigit(*s)) { - digit = (jint)((int)(*s++) - (int)('0')); - sum = (sum * 10) + digit; - if (sum > 2147483647) - return (0); /* Overflows jint (but not jlong) */ - } else - return (0); - *value = (jint)sum; - return (1); -} - -/* - * Modeled after strcmp(), compare two strings (as in the grammar defined - * in Appendix A of JSR 56). If both strings can be interpreted as - * Java ints, do a numeric comparison, else it is strcmp(). - */ -static int -comp_string(const char *s1, const char *s2) -{ - jint v1, v2; - if (isjavaint(s1, &v1) && isjavaint(s2, &v2)) - return ((int)(v1 - v2)); - else - return (JLI_StrCmp(s1, s2)); -} - -/* - * Modeled after strcmp(), compare two version-ids for a Prefix - * Match as defined in JSR 56. - */ -int -JLI_PrefixVersionId(const char *id1, char *id2) -{ - char *s1 = JLI_StringDup(id1); - char *s2 = JLI_StringDup(id2); - char *m1 = s1; - char *m2 = s2; - char *end1 = NULL; - char *end2 = NULL; - int res = 0; - - do { - - if ((s1 != NULL) && ((end1 = JLI_StrPBrk(s1, ".-_")) != NULL)) - *end1 = '\0'; - if ((s2 != NULL) && ((end2 = JLI_StrPBrk(s2, ".-_")) != NULL)) - *end2 = '\0'; - - res = comp_string(s1, s2); - - if (end1 != NULL) - s1 = end1 + 1; - else - s1 = NULL; - if (end2 != NULL) - s2 = end2 + 1; - else - s2 = NULL; - - } while (res == 0 && ((s1 != NULL) && (s2 != NULL))); - - JLI_MemFree(m1); - JLI_MemFree(m2); - return (res); -} - -/* - * Modeled after strcmp(), compare two version-ids for an Exact - * Match as defined in JSR 56. - */ -int -JLI_ExactVersionId(const char *id1, char *id2) -{ - char *s1 = JLI_StringDup(id1); - char *s2 = JLI_StringDup(id2); - char *m1 = s1; - char *m2 = s2; - char *end1 = NULL; - char *end2 = NULL; - int res = 0; - - do { - - if ((s1 != NULL) && ((end1 = JLI_StrPBrk(s1, separators)) != NULL)) - *end1 = '\0'; - if ((s2 != NULL) && ((end2 = JLI_StrPBrk(s2, separators)) != NULL)) - *end2 = '\0'; - - if ((s1 != NULL) && (s2 == NULL)) - res = comp_string(s1, zero_string); - else if ((s1 == NULL) && (s2 != NULL)) - res = comp_string(zero_string, s2); - else - res = comp_string(s1, s2); - - if (end1 != NULL) - s1 = end1 + 1; - else - s1 = NULL; - if (end2 != NULL) - s2 = end2 + 1; - else - s2 = NULL; - - } while (res == 0 && ((s1 != NULL) || (s2 != NULL))); - - JLI_MemFree(m1); - JLI_MemFree(m2); - return (res); -} - -/* - * Return true if this simple-element (as defined in JSR 56) forms - * an acceptable match. - * - * JSR 56 is modified by the Java Web Start Developer Guide - * where it is stated "... Java Web Start will not consider an installed - * non-FCS (i.e., milestone) JRE as a match. ... a JRE from Sun - * Microsystems, Inc., is by convention a non-FCS (milestone) JRE - * if there is a dash (-) in the version string." - * - * An undocumented caveat to the above is that an exact match with a - * hyphen is accepted as a development extension. - * - * These modifications are addressed by the specific comparisons - * for releases with hyphens. - */ -static int -acceptable_simple_element(const char *release, char *simple_element) -{ - char *modifier; - modifier = simple_element + JLI_StrLen(simple_element) - 1; - if (*modifier == '*') { - *modifier = '\0'; - if (JLI_StrChr(release, '-')) - return ((JLI_StrCmp(release, simple_element) == 0)?1:0); - return ((JLI_PrefixVersionId(release, simple_element) == 0)?1:0); - } else if (*modifier == '+') { - *modifier = '\0'; - if (JLI_StrChr(release, '-')) - return ((JLI_StrCmp(release, simple_element) == 0)?1:0); - return ((JLI_ExactVersionId(release, simple_element) >= 0)?1:0); - } else { - return ((JLI_ExactVersionId(release, simple_element) == 0)?1:0); - } -} - -/* - * Return true if this element (as defined in JSR 56) forms - * an acceptable match. An element is the intersection (and) - * of multiple simple-elements. - */ -static int -acceptable_element(const char *release, char *element) -{ - char *end; - do { - if ((end = JLI_StrChr(element, '&')) != NULL) - *end = '\0'; - if (!acceptable_simple_element(release, element)) - return (0); - if (end != NULL) - element = end + 1; - } while (end != NULL); - return (1); -} - -/* - * Checks if release is acceptable by the specification version-string. - * Return true if this version-string (as defined in JSR 56) forms - * an acceptable match. A version-string is the union (or) of multiple - * elements. - */ -int -JLI_AcceptableRelease(const char *release, char *version_string) -{ - char *vs; - char *m1; - char *end; - m1 = vs = JLI_StringDup(version_string); - do { - if ((end = JLI_StrChr(vs, ' ')) != NULL) - *end = '\0'; - if (acceptable_element(release, vs)) { - JLI_MemFree(m1); - return (1); - } - if (end != NULL) - vs = end + 1; - } while (end != NULL); - JLI_MemFree(m1); - return (0); -} - -/* - * Return true if this is a valid simple-element (as defined in JSR 56). - * - * The official grammar for a simple-element is: - * - * simple-element ::= version-id | version-id modifier - * modifier ::= '+' | '*' - * version-id ::= string ( separator string )* - * string ::= char ( char )* - * char ::= Any ASCII character except a space, an - * ampersand, a separator or a modifier - * separator ::= '.' | '-' | '_' - * - * However, for efficiency, it is time to abandon the top down parser - * implementation. After deleting the potential trailing modifier, we - * are left with a version-id. - * - * Note that a valid version-id has three simple properties: - * - * 1) Doesn't contain a space, an ampersand or a modifier. - * - * 2) Doesn't begin or end with a separator. - * - * 3) Doesn't contain two adjacent separators. - * - * Any other line noise constitutes a valid version-id. - */ -static int -valid_simple_element(char *simple_element) -{ - char *last; - size_t len; - - if ((simple_element == NULL) || ((len = JLI_StrLen(simple_element)) == 0)) - return (0); - last = simple_element + len - 1; - if (*last == '*' || *last == '+') { - if (--len == 0) - return (0); - *last-- = '\0'; - } - if (JLI_StrPBrk(simple_element, " &+*") != NULL) /* Property #1 */ - return (0); - if ((JLI_StrChr(".-_", *simple_element) != NULL) || /* Property #2 */ - (JLI_StrChr(".-_", *last) != NULL)) - return (0); - for (; simple_element != last; simple_element++) /* Property #3 */ - if ((JLI_StrChr(".-_", *simple_element) != NULL) && - (JLI_StrChr(".-_", *(simple_element + 1)) != NULL)) - return (0); - return (1); -} - -/* - * Return true if this is a valid element (as defined in JSR 56). - * An element is the intersection (and) of multiple simple-elements. - */ -static int -valid_element(char *element) -{ - char *end; - if ((element == NULL) || (JLI_StrLen(element) == 0)) - return (0); - do { - if ((end = JLI_StrChr(element, '&')) != NULL) - *end = '\0'; - if (!valid_simple_element(element)) - return (0); - if (end != NULL) - element = end + 1; - } while (end != NULL); - return (1); -} - -/* - * Validates a version string by the extended JSR 56 grammar. - */ -int -JLI_ValidVersionString(char *version_string) -{ - char *vs; - char *m1; - char *end; - if ((version_string == NULL) || (JLI_StrLen(version_string) == 0)) - return (0); - m1 = vs = JLI_StringDup(version_string); - do { - if ((end = JLI_StrChr(vs, ' ')) != NULL) - *end = '\0'; - if (!valid_element(vs)) { - JLI_MemFree(m1); - return (0); - } - if (end != NULL) - vs = end + 1; - } while (end != NULL); - JLI_MemFree(m1); - return (1); -} diff --git a/jdk/src/java.base/unix/classes/sun/nio/ch/FileDispatcherImpl.java b/jdk/src/java.base/unix/classes/sun/nio/ch/FileDispatcherImpl.java index c6c85f7fac9..9d960e2d2e0 100644 --- a/jdk/src/java.base/unix/classes/sun/nio/ch/FileDispatcherImpl.java +++ b/jdk/src/java.base/unix/classes/sun/nio/ch/FileDispatcherImpl.java @@ -25,10 +25,10 @@ package sun.nio.ch; -import java.io.*; +import java.io.FileDescriptor; +import java.io.IOException; -class FileDispatcherImpl extends FileDispatcher -{ +class FileDispatcherImpl extends FileDispatcher { static { IOUtil.load(); @@ -104,6 +104,14 @@ class FileDispatcherImpl extends FileDispatcher return new FileDescriptor(); } + boolean canTransferToDirectly(java.nio.channels.SelectableChannel sc) { + return true; + } + + boolean transferToDirectlyNeedsPositionLock() { + return false; + } + // -- Native methods -- static native int read0(FileDescriptor fd, long address, int len) diff --git a/jdk/src/java.base/unix/classes/sun/nio/fs/UnixChannelFactory.java b/jdk/src/java.base/unix/classes/sun/nio/fs/UnixChannelFactory.java index bc194f960ae..90a9c787ff0 100644 --- a/jdk/src/java.base/unix/classes/sun/nio/fs/UnixChannelFactory.java +++ b/jdk/src/java.base/unix/classes/sun/nio/fs/UnixChannelFactory.java @@ -270,6 +270,22 @@ class UnixChannelFactory { throw x; } + // fail if the file is a directory + if (flags.read) { + UnixException exc = null; + try { + if (UnixFileAttributes.get(fd).isDirectory()) { + exc = new UnixException(EISDIR); + } + } catch (UnixException x) { + exc = x; + } + if (exc != null) { + close(fd); + throw exc; + } + } + // unlink file immediately if delete on close. The spec is clear that // an implementation cannot guarantee to unlink the correct file when // replaced by an attacker after it is opened. diff --git a/jdk/src/java.base/unix/native/libjli/java_md.h b/jdk/src/java.base/unix/native/libjli/java_md.h index ec0615c1320..212ae0a2732 100644 --- a/jdk/src/java.base/unix/native/libjli/java_md.h +++ b/jdk/src/java.base/unix/native/libjli/java_md.h @@ -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 @@ -43,11 +43,6 @@ #define MAXNAMELEN PATH_MAX #endif -/* - * Common function prototypes and sundries. - */ -char *LocateJRE(manifest_info *info); -void ExecJRE(char *jre, char **argv); int UnsetEnv(char *name); char *FindExecName(char *program); const char *SetExecname(char **argv); diff --git a/jdk/src/java.base/unix/native/libjli/java_md_common.c b/jdk/src/java.base/unix/native/libjli/java_md_common.c index fb446db739a..27d5a2ddcaa 100644 --- a/jdk/src/java.base/unix/native/libjli/java_md_common.c +++ b/jdk/src/java.base/unix/native/libjli/java_md_common.c @@ -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 @@ -190,200 +190,6 @@ CheckSanity(char *path, char *dir) return ((access(buffer, X_OK) == 0) ? 1 : 0); } -/* - * Determine if there is an acceptable JRE in the directory dirname. - * Upon locating the "best" one, return a fully qualified path to - * it. "Best" is defined as the most advanced JRE meeting the - * constraints contained in the manifest_info. If no JRE in this - * directory meets the constraints, return NULL. - * - * Note that we don't check for errors in reading the directory - * (which would be done by checking errno). This is because it - * doesn't matter if we get an error reading the directory, or - * we just don't find anything interesting in the directory. We - * just return NULL in either case. - * - * The historical names of j2sdk and j2re were changed to jdk and - * jre respecively as part of the 1.5 rebranding effort. Since the - * former names are legacy on Linux, they must be recognized for - * all time. Fortunately, this is a minor cost. - */ -static char -*ProcessDir(manifest_info *info, char *dirname) -{ - DIR *dirp; - struct dirent *dp; - char *best = NULL; - int offset; - int best_offset = 0; - char *ret_str = NULL; - char buffer[PATH_MAX]; - - if ((dirp = opendir(dirname)) == NULL) - return (NULL); - - do { - if ((dp = readdir(dirp)) != NULL) { - offset = 0; - if ((JLI_StrNCmp(dp->d_name, "jre", 3) == 0) || - (JLI_StrNCmp(dp->d_name, "jdk", 3) == 0)) - offset = 3; - else if (JLI_StrNCmp(dp->d_name, "j2re", 4) == 0) - offset = 4; - else if (JLI_StrNCmp(dp->d_name, "j2sdk", 5) == 0) - offset = 5; - if (offset > 0) { - if ((JLI_AcceptableRelease(dp->d_name + offset, - info->jre_version)) && CheckSanity(dirname, dp->d_name)) - if ((best == NULL) || (JLI_ExactVersionId( - dp->d_name + offset, best + best_offset) > 0)) { - if (best != NULL) - JLI_MemFree(best); - best = JLI_StringDup(dp->d_name); - best_offset = offset; - } - } - } - } while (dp != NULL); - (void) closedir(dirp); - if (best == NULL) - return (NULL); - else { - ret_str = JLI_MemAlloc(JLI_StrLen(dirname) + JLI_StrLen(best) + 2); - sprintf(ret_str, "%s/%s", dirname, best); - JLI_MemFree(best); - return (ret_str); - } -} - -/* - * This is the global entry point. It examines the host for the optimal - * JRE to be used by scanning a set of directories. The set of directories - * is platform dependent and can be overridden by the environment - * variable JAVA_VERSION_PATH. - * - * This routine itself simply determines the set of appropriate - * directories before passing control onto ProcessDir(). - */ -char* -LocateJRE(manifest_info* info) -{ - char *path; - char *home; - char *target = NULL; - char *dp; - char *cp; - - /* - * Start by getting JAVA_VERSION_PATH - */ - if (info->jre_restrict_search) { - path = JLI_StringDup(system_dir); - } else if ((path = getenv("JAVA_VERSION_PATH")) != NULL) { - path = JLI_StringDup(path); - } else { - if ((home = getenv("HOME")) != NULL) { - path = (char *)JLI_MemAlloc(JLI_StrLen(home) + \ - JLI_StrLen(system_dir) + JLI_StrLen(user_dir) + 2); - sprintf(path, "%s%s:%s", home, user_dir, system_dir); - } else { - path = JLI_StringDup(system_dir); - } - } - - /* - * Step through each directory on the path. Terminate the scan with - * the first directory with an acceptable JRE. - */ - cp = dp = path; - while (dp != NULL) { - cp = JLI_StrChr(dp, (int)':'); - if (cp != NULL) - *cp = '\0'; - if ((target = ProcessDir(info, dp)) != NULL) - break; - dp = cp; - if (dp != NULL) - dp++; - } - JLI_MemFree(path); - return (target); -} - -/* - * Given a path to a jre to execute, this routine checks if this process - * is indeed that jre. If not, it exec's that jre. - * - * We want to actually check the paths rather than just the version string - * built into the executable, so that given version specification (and - * JAVA_VERSION_PATH) will yield the exact same Java environment, regardless - * of the version of the arbitrary launcher we start with. - */ -void -ExecJRE(char *jre, char **argv) -{ - char wanted[PATH_MAX]; - const char* progname = GetProgramName(); - const char* execname = NULL; - - /* - * Resolve the real path to the directory containing the selected JRE. - */ - if (realpath(jre, wanted) == NULL) { - JLI_ReportErrorMessage(JRE_ERROR9, jre); - exit(1); - } - - /* - * Resolve the real path to the currently running launcher. - */ - SetExecname(argv); - execname = GetExecName(); - if (execname == NULL) { - JLI_ReportErrorMessage(JRE_ERROR10); - exit(1); - } - - /* - * If the path to the selected JRE directory is a match to the initial - * portion of the path to the currently executing JRE, we have a winner! - * If so, just return. - */ - if (JLI_StrNCmp(wanted, execname, JLI_StrLen(wanted)) == 0) - return; /* I am the droid you were looking for */ - - - /* - * This should never happen (because of the selection code in SelectJRE), - * but check for "impossibly" long path names just because buffer overruns - * can be so deadly. - */ - if (JLI_StrLen(wanted) + JLI_StrLen(progname) + 6 > PATH_MAX) { - JLI_ReportErrorMessage(JRE_ERROR11); - exit(1); - } - - /* - * Construct the path and exec it. - */ - (void)JLI_StrCat(JLI_StrCat(wanted, "/bin/"), progname); - argv[0] = JLI_StringDup(progname); - if (JLI_IsTraceLauncher()) { - int i; - printf("ReExec Command: %s (%s)\n", wanted, argv[0]); - printf("ReExec Args:"); - for (i = 1; argv[i] != NULL; i++) - printf(" %s", argv[i]); - printf("\n"); - } - JLI_TraceLauncher("TRACER_MARKER:About to EXEC\n"); - (void)fflush(stdout); - (void)fflush(stderr); - execv(wanted, argv); - JLI_ReportErrorMessageSys(JRE_ERROR12, wanted); - exit(1); -} - /* * "Borrowed" from Solaris 10 where the unsetenv() function is being added * to libc thanks to SUSv3 (Standard Unix Specification, version 3). As diff --git a/jdk/src/java.base/unix/native/libjli/java_md_solinux.c b/jdk/src/java.base/unix/native/libjli/java_md_solinux.c index 05f7a4d8112..77a36890a25 100644 --- a/jdk/src/java.base/unix/native/libjli/java_md_solinux.c +++ b/jdk/src/java.base/unix/native/libjli/java_md_solinux.c @@ -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 @@ -36,7 +36,6 @@ #include #include #include "manifest_info.h" -#include "version_comp.h" #define JVM_DLL "libjvm.so" @@ -100,10 +99,6 @@ * (incoming argv) * | * \|/ - * SelectVersion - * (selects the JRE version, note: not data model) - * | - * \|/ * CreateExecutionEnvironment * (determines desired data model) * | diff --git a/jdk/src/java.base/unix/native/libnio/ch/FileChannelImpl.c b/jdk/src/java.base/unix/native/libnio/ch/FileChannelImpl.c index 895289067d6..d8face71c37 100644 --- a/jdk/src/java.base/unix/native/libnio/ch/FileChannelImpl.c +++ b/jdk/src/java.base/unix/native/libnio/ch/FileChannelImpl.c @@ -154,10 +154,13 @@ Java_sun_nio_ch_FileChannelImpl_close0(JNIEnv *env, jobject this, jobject fdo) JNIEXPORT jlong JNICALL Java_sun_nio_ch_FileChannelImpl_transferTo0(JNIEnv *env, jobject this, - jint srcFD, + jobject srcFDO, jlong position, jlong count, - jint dstFD) + jobject dstFDO) { + jint srcFD = fdval(env, srcFDO); + jint dstFD = fdval(env, dstFDO); + #if defined(__linux__) off64_t offset = (off64_t)position; jlong n = sendfile64(dstFD, srcFD, &offset, (size_t)count); diff --git a/jdk/src/java.base/windows/classes/sun/nio/ch/FileDispatcherImpl.java b/jdk/src/java.base/windows/classes/sun/nio/ch/FileDispatcherImpl.java index 19997d0c1ec..c767a34cc08 100644 --- a/jdk/src/java.base/windows/classes/sun/nio/ch/FileDispatcherImpl.java +++ b/jdk/src/java.base/windows/classes/sun/nio/ch/FileDispatcherImpl.java @@ -25,21 +25,21 @@ package sun.nio.ch; -import java.io.*; +import java.io.FileDescriptor; +import java.io.IOException; +import java.security.PrivilegedAction; import sun.misc.SharedSecrets; import sun.misc.JavaIOFileDescriptorAccess; -class FileDispatcherImpl extends FileDispatcher -{ +class FileDispatcherImpl extends FileDispatcher { + private static final JavaIOFileDescriptorAccess fdAccess = SharedSecrets.getJavaIOFileDescriptorAccess(); - static { - IOUtil.load(); - } + // set to true if fast file transmission (TransmitFile) is enabled + private static final boolean fastFileTransfer; - FileDispatcherImpl() { - } + FileDispatcherImpl() { } @Override boolean needsPositionLock() { @@ -110,6 +110,36 @@ class FileDispatcherImpl extends FileDispatcher return result; } + boolean canTransferToDirectly(java.nio.channels.SelectableChannel sc) { + return fastFileTransfer && sc.isBlocking(); + } + + boolean transferToDirectlyNeedsPositionLock() { + return true; + } + + static boolean isFastFileTransferRequested() { + String fileTransferProp = java.security.AccessController.doPrivileged( + new PrivilegedAction() { + @Override + public String run() { + return System.getProperty("jdk.net.enableFastFileTransfer"); + } + }); + boolean enable; + if ("".equals(fileTransferProp)) { + enable = true; + } else { + enable = Boolean.parseBoolean(fileTransferProp); + } + return enable; + } + + static { + IOUtil.load(); + fastFileTransfer = isFastFileTransferRequested(); + } + //-- Native methods static native int read0(FileDescriptor fd, long address, int len) diff --git a/jdk/src/java.base/windows/native/libjli/java_md.c b/jdk/src/java.base/windows/native/libjli/java_md.c index 10fe6ce4a65..81b1c263821 100644 --- a/jdk/src/java.base/windows/native/libjli/java_md.c +++ b/jdk/src/java.base/windows/native/libjli/java_md.c @@ -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,7 +37,6 @@ #include #include "java.h" -#include "version_comp.h" #define JVM_DLL "jvm.dll" #define JAVA_DLL "java.dll" @@ -674,420 +673,6 @@ ServerClassMachine() { return (GetErgoPolicy() == ALWAYS_SERVER_CLASS) ? JNI_TRUE : JNI_FALSE; } -/* - * Determine if there is an acceptable JRE in the registry directory top_key. - * Upon locating the "best" one, return a fully qualified path to it. - * "Best" is defined as the most advanced JRE meeting the constraints - * contained in the manifest_info. If no JRE in this directory meets the - * constraints, return NULL. - * - * It doesn't matter if we get an error reading the registry, or we just - * don't find anything interesting in the directory. We just return NULL - * in either case. - */ -static char * -ProcessDir(manifest_info* info, HKEY top_key) { - DWORD index = 0; - HKEY ver_key; - char name[MAXNAMELEN]; - int len; - char *best = NULL; - - /* - * Enumerate "/SOFTWARE/JavaSoft/Java Runtime Environment" - * searching for the best available version. - */ - while (RegEnumKey(top_key, index, name, MAXNAMELEN) == ERROR_SUCCESS) { - index++; - if (JLI_AcceptableRelease(name, info->jre_version)) - if ((best == NULL) || (JLI_ExactVersionId(name, best) > 0)) { - if (best != NULL) - JLI_MemFree(best); - best = JLI_StringDup(name); - } - } - - /* - * Extract "JavaHome" from the "best" registry directory and return - * that path. If no appropriate version was located, or there is an - * error in extracting the "JavaHome" string, return null. - */ - if (best == NULL) - return (NULL); - else { - if (RegOpenKeyEx(top_key, best, 0, KEY_READ, &ver_key) - != ERROR_SUCCESS) { - JLI_MemFree(best); - if (ver_key != NULL) - RegCloseKey(ver_key); - return (NULL); - } - JLI_MemFree(best); - len = MAXNAMELEN; - if (RegQueryValueEx(ver_key, "JavaHome", NULL, NULL, (LPBYTE)name, &len) - != ERROR_SUCCESS) { - if (ver_key != NULL) - RegCloseKey(ver_key); - return (NULL); - } - if (ver_key != NULL) - RegCloseKey(ver_key); - return (JLI_StringDup(name)); - } -} - -/* - * This is the global entry point. It examines the host for the optimal - * JRE to be used by scanning a set of registry entries. This set of entries - * is hardwired on Windows as "Software\JavaSoft\Java Runtime Environment" - * under the set of roots "{ HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE }". - * - * This routine simply opens each of these registry directories before passing - * control onto ProcessDir(). - */ -char * -LocateJRE(manifest_info* info) { - HKEY key = NULL; - char *path; - int key_index; - HKEY root_keys[2] = { HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE }; - - for (key_index = 0; key_index <= 1; key_index++) { - if (RegOpenKeyEx(root_keys[key_index], JRE_KEY, 0, KEY_READ, &key) - == ERROR_SUCCESS) - if ((path = ProcessDir(info, key)) != NULL) { - if (key != NULL) - RegCloseKey(key); - return (path); - } - if (key != NULL) - RegCloseKey(key); - } - return NULL; -} - -/* - * Local helper routine to isolate a single token (option or argument) - * from the command line. - * - * This routine accepts a pointer to a character pointer. The first - * token (as defined by MSDN command-line argument syntax) is isolated - * from that string. - * - * Upon return, the input character pointer pointed to by the parameter s - * is updated to point to the remainding, unscanned, portion of the string, - * or to a null character if the entire string has been consummed. - * - * This function returns a pointer to a null-terminated string which - * contains the isolated first token, or to the null character if no - * token could be isolated. - * - * Note the side effect of modifying the input string s by the insertion - * of a null character, making it two strings. - * - * See "Parsing C Command-Line Arguments" in the MSDN Library for the - * parsing rule details. The rule summary from that specification is: - * - * * Arguments are delimited by white space, which is either a space or a tab. - * - * * A string surrounded by double quotation marks is interpreted as a single - * argument, regardless of white space contained within. A quoted string can - * be embedded in an argument. Note that the caret (^) is not recognized as - * an escape character or delimiter. - * - * * A double quotation mark preceded by a backslash, \", is interpreted as a - * literal double quotation mark ("). - * - * * Backslashes are interpreted literally, unless they immediately precede a - * double quotation mark. - * - * * If an even number of backslashes is followed by a double quotation mark, - * then one backslash (\) is placed in the argv array for every pair of - * backslashes (\\), and the double quotation mark (") is interpreted as a - * string delimiter. - * - * * If an odd number of backslashes is followed by a double quotation mark, - * then one backslash (\) is placed in the argv array for every pair of - * backslashes (\\) and the double quotation mark is interpreted as an - * escape sequence by the remaining backslash, causing a literal double - * quotation mark (") to be placed in argv. - */ -static char* -nextarg(char** s) { - char *p = *s; - char *head; - int slashes = 0; - int inquote = 0; - - /* - * Strip leading whitespace, which MSDN defines as only space or tab. - * (Hence, no locale specific "isspace" here.) - */ - while (*p != (char)0 && (*p == ' ' || *p == '\t')) - p++; - head = p; /* Save the start of the token to return */ - - /* - * Isolate a token from the command line. - */ - while (*p != (char)0 && (inquote || !(*p == ' ' || *p == '\t'))) { - if (*p == '\\' && *(p+1) == '"' && slashes % 2 == 0) - p++; - else if (*p == '"') - inquote = !inquote; - slashes = (*p++ == '\\') ? slashes + 1 : 0; - } - - /* - * If the token isolated isn't already terminated in a "char zero", - * then replace the whitespace character with one and move to the - * next character. - */ - if (*p != (char)0) - *p++ = (char)0; - - /* - * Update the parameter to point to the head of the remaining string - * reflecting the command line and return a pointer to the leading - * token which was isolated from the command line. - */ - *s = p; - return (head); -} - -/* - * Local helper routine to return a string equivalent to the input string - * s, but with quotes removed so the result is a string as would be found - * in argv[]. The returned string should be freed by a call to JLI_MemFree(). - * - * The rules for quoting (and escaped quotes) are: - * - * 1 A double quotation mark preceded by a backslash, \", is interpreted as a - * literal double quotation mark ("). - * - * 2 Backslashes are interpreted literally, unless they immediately precede a - * double quotation mark. - * - * 3 If an even number of backslashes is followed by a double quotation mark, - * then one backslash (\) is placed in the argv array for every pair of - * backslashes (\\), and the double quotation mark (") is interpreted as a - * string delimiter. - * - * 4 If an odd number of backslashes is followed by a double quotation mark, - * then one backslash (\) is placed in the argv array for every pair of - * backslashes (\\) and the double quotation mark is interpreted as an - * escape sequence by the remaining backslash, causing a literal double - * quotation mark (") to be placed in argv. - */ -static char* -unquote(const char *s) { - const char *p = s; /* Pointer to the tail of the original string */ - char *un = (char*)JLI_MemAlloc(JLI_StrLen(s) + 1); /* Ptr to unquoted string */ - char *pun = un; /* Pointer to the tail of the unquoted string */ - - while (*p != '\0') { - if (*p == '"') { - p++; - } else if (*p == '\\') { - const char *q = p + JLI_StrSpn(p,"\\"); - if (*q == '"') - do { - *pun++ = '\\'; - p += 2; - } while (*p == '\\' && p < q); - else - while (p < q) - *pun++ = *p++; - } else { - *pun++ = *p++; - } - } - *pun = '\0'; - return un; -} - -/* - * Given a path to a jre to execute, this routine checks if this process - * is indeed that jre. If not, it exec's that jre. - * - * We want to actually check the paths rather than just the version string - * built into the executable, so that given version specification will yield - * the exact same Java environment, regardless of the version of the arbitrary - * launcher we start with. - */ -void -ExecJRE(char *jre, char **argv) { - jint len; - char path[MAXPATHLEN + 1]; - - const char *progname = GetProgramName(); - - /* - * Resolve the real path to the currently running launcher. - */ - len = GetModuleFileName(NULL, path, MAXPATHLEN + 1); - if (len == 0 || len > MAXPATHLEN) { - JLI_ReportErrorMessageSys(JRE_ERROR9, progname); - exit(1); - } - - JLI_TraceLauncher("ExecJRE: old: %s\n", path); - JLI_TraceLauncher("ExecJRE: new: %s\n", jre); - - /* - * If the path to the selected JRE directory is a match to the initial - * portion of the path to the currently executing JRE, we have a winner! - * If so, just return. - */ - if (JLI_StrNCaseCmp(jre, path, JLI_StrLen(jre)) == 0) - return; /* I am the droid you were looking for */ - - /* - * If this isn't the selected version, exec the selected version. - */ - JLI_Snprintf(path, sizeof(path), "%s\\bin\\%s.exe", jre, progname); - - /* - * Although Windows has an execv() entrypoint, it doesn't actually - * overlay a process: it can only create a new process and terminate - * the old process. Therefore, any processes waiting on the initial - * process wake up and they shouldn't. Hence, a chain of pseudo-zombie - * processes must be retained to maintain the proper wait semantics. - * Fortunately the image size of the launcher isn't too large at this - * time. - * - * If it weren't for this semantic flaw, the code below would be ... - * - * execv(path, argv); - * JLI_ReportErrorMessage("Error: Exec of %s failed\n", path); - * exit(1); - * - * The incorrect exec semantics could be addressed by: - * - * exit((int)spawnv(_P_WAIT, path, argv)); - * - * Unfortunately, a bug in Windows spawn/exec impementation prevents - * this from completely working. All the Windows POSIX process creation - * interfaces are implemented as wrappers around the native Windows - * function CreateProcess(). CreateProcess() takes a single string - * to specify command line options and arguments, so the POSIX routine - * wrappers build a single string from the argv[] array and in the - * process, any quoting information is lost. - * - * The solution to this to get the original command line, to process it - * to remove the new multiple JRE options (if any) as was done for argv - * in the common SelectVersion() routine and finally to pass it directly - * to the native CreateProcess() Windows process control interface. - */ - { - char *cmdline; - char *p; - char *np; - char *ocl; - char *ccl; - char *unquoted; - DWORD exitCode; - STARTUPINFO si; - PROCESS_INFORMATION pi; - - /* - * The following code block gets and processes the original command - * line, replacing the argv[0] equivalent in the command line with - * the path to the new executable and removing the appropriate - * Multiple JRE support options. Note that similar logic exists - * in the platform independent SelectVersion routine, but is - * replicated here due to the syntax of CreateProcess(). - * - * The magic "+ 4" characters added to the command line length are - * 2 possible quotes around the path (argv[0]), a space after the - * path and a terminating null character. - */ - ocl = GetCommandLine(); - np = ccl = JLI_StringDup(ocl); - p = nextarg(&np); /* Discard argv[0] */ - cmdline = (char *)JLI_MemAlloc(JLI_StrLen(path) + JLI_StrLen(np) + 4); - if (JLI_StrChr(path, (int)' ') == NULL && JLI_StrChr(path, (int)'\t') == NULL) - cmdline = JLI_StrCpy(cmdline, path); - else - cmdline = JLI_StrCat(JLI_StrCat(JLI_StrCpy(cmdline, "\""), path), "\""); - - while (*np != (char)0) { /* While more command-line */ - p = nextarg(&np); - if (*p != (char)0) { /* If a token was isolated */ - unquoted = unquote(p); - if (*unquoted == '-') { /* Looks like an option */ - if (JLI_StrCmp(unquoted, "-classpath") == 0 || - JLI_StrCmp(unquoted, "-cp") == 0) { /* Unique cp syntax */ - cmdline = JLI_StrCat(JLI_StrCat(cmdline, " "), p); - p = nextarg(&np); - if (*p != (char)0) /* If a token was isolated */ - cmdline = JLI_StrCat(JLI_StrCat(cmdline, " "), p); - } else if (JLI_StrNCmp(unquoted, "-version:", 9) != 0 && - JLI_StrCmp(unquoted, "-jre-restrict-search") != 0 && - JLI_StrCmp(unquoted, "-no-jre-restrict-search") != 0) { - cmdline = JLI_StrCat(JLI_StrCat(cmdline, " "), p); - } - } else { /* End of options */ - cmdline = JLI_StrCat(JLI_StrCat(cmdline, " "), p); - cmdline = JLI_StrCat(JLI_StrCat(cmdline, " "), np); - JLI_MemFree((void *)unquoted); - break; - } - JLI_MemFree((void *)unquoted); - } - } - JLI_MemFree((void *)ccl); - - if (JLI_IsTraceLauncher()) { - np = ccl = JLI_StringDup(cmdline); - p = nextarg(&np); - printf("ReExec Command: %s (%s)\n", path, p); - printf("ReExec Args: %s\n", np); - JLI_MemFree((void *)ccl); - } - (void)fflush(stdout); - (void)fflush(stderr); - - /* - * The following code is modeled after a model presented in the - * Microsoft Technical Article "Moving Unix Applications to - * Windows NT" (March 6, 1994) and "Creating Processes" on MSDN - * (Februrary 2005). It approximates UNIX spawn semantics with - * the parent waiting for termination of the child. - */ - memset(&si, 0, sizeof(si)); - si.cb =sizeof(STARTUPINFO); - memset(&pi, 0, sizeof(pi)); - - if (!CreateProcess((LPCTSTR)path, /* executable name */ - (LPTSTR)cmdline, /* command line */ - (LPSECURITY_ATTRIBUTES)NULL, /* process security attr. */ - (LPSECURITY_ATTRIBUTES)NULL, /* thread security attr. */ - (BOOL)TRUE, /* inherits system handles */ - (DWORD)0, /* creation flags */ - (LPVOID)NULL, /* environment block */ - (LPCTSTR)NULL, /* current directory */ - (LPSTARTUPINFO)&si, /* (in) startup information */ - (LPPROCESS_INFORMATION)&pi)) { /* (out) process information */ - JLI_ReportErrorMessageSys(SYS_ERROR1, path); - exit(1); - } - - if (WaitForSingleObject(pi.hProcess, INFINITE) != WAIT_FAILED) { - if (GetExitCodeProcess(pi.hProcess, &exitCode) == FALSE) - exitCode = 1; - } else { - JLI_ReportErrorMessage(SYS_ERROR2); - exitCode = 1; - } - - CloseHandle(pi.hThread); - CloseHandle(pi.hProcess); - - exit(exitCode); - } -} - /* * Wrapper for platform dependent unsetenv function. */ diff --git a/jdk/src/java.base/windows/native/libjli/java_md.h b/jdk/src/java.base/windows/native/libjli/java_md.h index 72151b92e50..aa9fc2f0b44 100644 --- a/jdk/src/java.base/windows/native/libjli/java_md.h +++ b/jdk/src/java.base/windows/native/libjli/java_md.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,8 +50,7 @@ extern jlong Counter2Micros(jlong counts); /* * Function prototypes. */ -char *LocateJRE(manifest_info *info); -void ExecJRE(char *jre, char **argv); + int UnsetEnv(char *name); #endif /* JAVA_MD_H */ diff --git a/jdk/src/java.base/windows/native/libnio/ch/FileChannelImpl.c b/jdk/src/java.base/windows/native/libnio/ch/FileChannelImpl.c index 0c03958aa33..2e0a6ca0fd9 100644 --- a/jdk/src/java.base/windows/native/libnio/ch/FileChannelImpl.c +++ b/jdk/src/java.base/windows/native/libnio/ch/FileChannelImpl.c @@ -31,6 +31,10 @@ #include "nio.h" #include "nio_util.h" #include "sun_nio_ch_FileChannelImpl.h" +#include "java_lang_Integer.h" + +#include +#pragma comment(lib, "Mswsock.lib") static jfieldID chan_fd; /* id for jobject 'fd' in java.io.FileChannel */ @@ -175,9 +179,42 @@ Java_sun_nio_ch_FileChannelImpl_close0(JNIEnv *env, jobject this, jobject fdo) JNIEXPORT jlong JNICALL Java_sun_nio_ch_FileChannelImpl_transferTo0(JNIEnv *env, jobject this, - jint srcFD, + jobject srcFD, jlong position, jlong count, - jint dstFD) + jobject dstFD) { - return IOS_UNSUPPORTED; + const int PACKET_SIZE = 524288; + + HANDLE src = (HANDLE)(handleval(env, srcFD)); + SOCKET dst = (SOCKET)(fdval(env, dstFD)); + DWORD chunkSize = (count > java_lang_Integer_MAX_VALUE) ? + java_lang_Integer_MAX_VALUE : (DWORD)count; + BOOL result = 0; + + jlong pos = Java_sun_nio_ch_FileChannelImpl_position0(env, this, srcFD, position); + if (pos == IOS_THROWN) { + return IOS_THROWN; + } + + result = TransmitFile( + dst, + src, + chunkSize, + PACKET_SIZE, + NULL, + NULL, + TF_USE_KERNEL_APC + ); + if (!result) { + int error = WSAGetLastError(); + if (WSAEINVAL == error && count >= 0) { + return IOS_UNSUPPORTED_CASE; + } + if (WSAENOTSOCK == error) { + return IOS_UNSUPPORTED_CASE; + } + JNU_ThrowIOExceptionWithLastError(env, "transfer failed"); + return IOS_THROWN; + } + return chunkSize; } diff --git a/jdk/src/java.corba/share/classes/com/sun/jndi/cosnaming/CNNameParser.java b/jdk/src/java.corba/share/classes/com/sun/jndi/cosnaming/CNNameParser.java index ebd0f05e65a..2b416941fc6 100644 --- a/jdk/src/java.corba/share/classes/com/sun/jndi/cosnaming/CNNameParser.java +++ b/jdk/src/java.corba/share/classes/com/sun/jndi/cosnaming/CNNameParser.java @@ -256,7 +256,7 @@ final public class CNNameParser implements NameParser { private static String stringifyComponent(NameComponent comp) { StringBuilder one = new StringBuilder(escape(comp.id)); if (comp.kind != null && !comp.kind.equals("")) { - one.append(kindSeparator + escape(comp.kind)); + one.append(kindSeparator).append(escape(comp.kind)); } if (one.length() == 0) { return ""+kindSeparator; // if neither id nor kind specified diff --git a/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java b/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java index 36cdc3272b4..b852d8ae78c 100644 --- a/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java +++ b/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java @@ -458,11 +458,11 @@ public class LogManager { JavaAWTAccess javaAwtAccess = SharedSecrets.getJavaAWTAccess(); if (sm != null && javaAwtAccess != null) { // for each applet, it has its own LoggerContext isolated from others - synchronized (javaAwtAccess) { - // find the AppContext of the applet code - // will be null if we are in the main app context. - final Object ecx = javaAwtAccess.getAppletContext(); - if (ecx != null) { + final Object ecx = javaAwtAccess.getAppletContext(); + if (ecx != null) { + synchronized (javaAwtAccess) { + // find the AppContext of the applet code + // will be null if we are in the main app context. if (contextsMap == null) { contextsMap = new WeakHashMap<>(); } diff --git a/jdk/src/java.management/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java b/jdk/src/java.management/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java index 47b95927307..a0589f72b05 100644 --- a/jdk/src/java.management/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java +++ b/jdk/src/java.management/share/classes/com/sun/jmx/interceptor/DefaultMBeanServerInterceptor.java @@ -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 @@ -1707,16 +1707,19 @@ public class DefaultMBeanServerInterceptor implements MBeanServerInterceptor { throw new UnsupportedOperationException("Not supported yet."); } + @SuppressWarnings("deprecation") public ObjectInputStream deserialize(ObjectName name, byte[] data) throws InstanceNotFoundException, OperationsException { throw new UnsupportedOperationException("Not supported yet."); } + @SuppressWarnings("deprecation") public ObjectInputStream deserialize(String className, byte[] data) throws OperationsException, ReflectionException { throw new UnsupportedOperationException("Not supported yet."); } + @SuppressWarnings("deprecation") public ObjectInputStream deserialize(String className, ObjectName loaderName, byte[] data) throws InstanceNotFoundException, OperationsException, ReflectionException { diff --git a/jdk/src/java.management/share/classes/javax/management/MBeanPermission.java b/jdk/src/java.management/share/classes/javax/management/MBeanPermission.java index 4a3442511a3..5aa18b70960 100644 --- a/jdk/src/java.management/share/classes/javax/management/MBeanPermission.java +++ b/jdk/src/java.management/share/classes/javax/management/MBeanPermission.java @@ -455,11 +455,11 @@ public class MBeanPermission extends Permission { name.append(className); if (member == null) member = "-"; - name.append("#" + member); + name.append('#').append(member); if (objectName == null) name.append("[-]"); else - name.append("[").append(objectName.getCanonicalName()).append("]"); + name.append('[').append(objectName.getCanonicalName()).append(']'); /* In the interests of legibility for Permission.toString(), we transform the empty string into "*". */ diff --git a/jdk/src/java.management/share/classes/javax/management/modelmbean/RequiredModelMBean.java b/jdk/src/java.management/share/classes/javax/management/modelmbean/RequiredModelMBean.java index d9323203a03..16110614cf6 100644 --- a/jdk/src/java.management/share/classes/javax/management/modelmbean/RequiredModelMBean.java +++ b/jdk/src/java.management/share/classes/javax/management/modelmbean/RequiredModelMBean.java @@ -716,15 +716,14 @@ public class RequiredModelMBean } retStr.append("\nMBeanInfo for ModelMBean is:"); - retStr.append("\nCLASSNAME: \t"+ info.getClassName()); - retStr.append("\nDESCRIPTION: \t"+ info.getDescription()); + retStr.append("\nCLASSNAME: \t").append(info.getClassName()); + retStr.append("\nDESCRIPTION: \t").append(info.getDescription()); try { - retStr.append("\nMBEAN DESCRIPTOR: \t"+ - info.getMBeanDescriptor()); + retStr.append("\nMBEAN DESCRIPTOR: \t").append(info.getMBeanDescriptor()); } catch (Exception e) { - retStr.append("\nMBEAN DESCRIPTOR: \t" + " is invalid"); + retStr.append("\nMBEAN DESCRIPTOR: \t is invalid"); } retStr.append("\nATTRIBUTES"); @@ -734,13 +733,12 @@ public class RequiredModelMBean for (int i=0; i extends OpenType { elementType = at.getElementOpenType(); isPrimitiveArray = at.isPrimitiveArray(); } - StringBuilder result = - new StringBuilder(dimension + "-dimension array of "); + StringBuilder result = new StringBuilder(); + result.append(dimension).append("-dimension array of "); final String elementClassName = elementType.getClassName(); if (isPrimitiveArray) { // Convert from wrapper type to primitive type diff --git a/jdk/src/java.management/share/classes/sun/management/Agent.java b/jdk/src/java.management/share/classes/sun/management/Agent.java index 226986be994..3128ca442ea 100644 --- a/jdk/src/java.management/share/classes/sun/management/Agent.java +++ b/jdk/src/java.management/share/classes/sun/management/Agent.java @@ -499,7 +499,7 @@ public class Agent { } else { StringBuilder message = new StringBuilder(params[0]); for (int i = 1; i < params.length; i++) { - message.append(" " + params[i]); + message.append(' ').append(params[i]); } error(key, message.toString()); } diff --git a/jdk/src/java.management/share/classes/sun/management/MappedMXBeanType.java b/jdk/src/java.management/share/classes/sun/management/MappedMXBeanType.java index 9bfcbd9c682..04ab87153f8 100644 --- a/jdk/src/java.management/share/classes/sun/management/MappedMXBeanType.java +++ b/jdk/src/java.management/share/classes/sun/management/MappedMXBeanType.java @@ -289,7 +289,7 @@ public abstract class MappedMXBeanType { if (et.isPrimitive()) { className = new StringBuilder(c.getName()); } else { - className.append("L" + baseElementType.getTypeName() + ";"); + className.append('L').append(baseElementType.getTypeName()).append(';'); } try { mappedTypeClass = Class.forName(className.toString()); @@ -385,7 +385,7 @@ public abstract class MappedMXBeanType { if (elementType instanceof Class && ((Class) elementType).isPrimitive()) { className = new StringBuilder(gat.toString()); } else { - className.append("L" + baseElementType.getTypeName() + ";"); + className.append('L').append(baseElementType.getTypeName()).append(';'); } try { mappedTypeClass = Class.forName(className.toString()); diff --git a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/Connection.java b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/Connection.java index 5663126e80a..c50d3f19ddb 100644 --- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/Connection.java +++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/Connection.java @@ -111,7 +111,6 @@ public final class Connection implements Runnable { private static final boolean debug = false; private static final int dump = 0; // > 0 r, > 1 rw - public static final long DEFAULT_READ_TIMEOUT_MILLIS = 15 * 1000; // 15 second timeout; final private Thread worker; // Initialized in constructor @@ -414,10 +413,13 @@ public final class Connection implements Runnable { // will be woken up before readTimeout only if reply is // available ldr.wait(readTimeout); + waited = true; } else { - ldr.wait(DEFAULT_READ_TIMEOUT_MILLIS); + // no timeout is set so we wait infinitely until + // a response is received + // http://docs.oracle.com/javase/8/docs/technotes/guides/jndi/jndi-ldap.html#PROP + ldr.wait(); } - waited = true; } else { break; } diff --git a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/sasl/DefaultCallbackHandler.java b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/sasl/DefaultCallbackHandler.java index 3e0098eaaa4..a1d53b277f2 100644 --- a/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/sasl/DefaultCallbackHandler.java +++ b/jdk/src/java.naming/share/classes/com/sun/jndi/ldap/sasl/DefaultCallbackHandler.java @@ -90,7 +90,7 @@ final class DefaultCallbackHandler implements CallbackHandler { if (selected == -1) { StringBuilder allChoices = new StringBuilder(); for (int j = 0; j < choices.length; j++) { - allChoices.append(choices[j] + ","); + allChoices.append(choices[j]).append(','); } throw new IOException("Cannot match " + "'java.naming.security.sasl.realm' property value, '" + diff --git a/jdk/src/java.naming/share/classes/javax/naming/NameImpl.java b/jdk/src/java.naming/share/classes/javax/naming/NameImpl.java index 5cc8d59c0fe..8b45c8813ef 100644 --- a/jdk/src/java.naming/share/classes/javax/naming/NameImpl.java +++ b/jdk/src/java.naming/share/classes/javax/naming/NameImpl.java @@ -170,7 +170,7 @@ class NameImpl { endQuote = one ? syntaxEndQuote1 : syntaxEndQuote2; i += syntaxTypevalSeparator.length(); - answer.append(syntaxTypevalSeparator+beginQuote); // add back + answer.append(syntaxTypevalSeparator).append(beginQuote); // add back // consume string until matching quote for (i += beginQuote.length(); diff --git a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Config.java b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Config.java index 26722f2b885..30f5f67ccf2 100644 --- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Config.java +++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Config.java @@ -30,19 +30,19 @@ */ package sun.security.krb5; -import java.io.File; -import java.io.FilePermission; +import java.io.*; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.Path; import java.security.PrivilegedAction; import java.util.*; -import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.security.AccessController; import java.security.PrivilegedExceptionAction; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import sun.net.dns.ResolverConfiguration; import sun.security.krb5.internal.crypto.EType; @@ -314,6 +314,72 @@ public class Config { } } + /** + * Translates a duration value into seconds. + * + * The format can be one of "h:m[:s]", "NdNhNmNs", and "N". See + * http://web.mit.edu/kerberos/krb5-devel/doc/basic/date_format.html#duration + * for definitions. + * + * @param s the string duration + * @return time in seconds + * @throw KrbException if format is illegal + */ + public static int duration(String s) throws KrbException { + + if (s.isEmpty()) { + throw new KrbException("Duration cannot be empty"); + } + + // N + if (s.matches("\\d+")) { + return Integer.parseInt(s); + } + + // h:m[:s] + Matcher m = Pattern.compile("(\\d+):(\\d+)(:(\\d+))?").matcher(s); + if (m.matches()) { + int hr = Integer.parseInt(m.group(1)); + int min = Integer.parseInt(m.group(2)); + if (min >= 60) { + throw new KrbException("Illegal duration format " + s); + } + int result = hr * 3600 + min * 60; + if (m.group(4) != null) { + int sec = Integer.parseInt(m.group(4)); + if (sec >= 60) { + throw new KrbException("Illegal duration format " + s); + } + result += sec; + } + return result; + } + + // NdNhNmNs + // 120m allowed. Maybe 1h120m is not good, but still allowed + m = Pattern.compile( + "((\\d+)d)?\\s*((\\d+)h)?\\s*((\\d+)m)?\\s*((\\d+)s)?", + Pattern.CASE_INSENSITIVE).matcher(s); + if (m.matches()) { + int result = 0; + if (m.group(2) != null) { + result += 86400 * Integer.parseInt(m.group(2)); + } + if (m.group(4) != null) { + result += 3600 * Integer.parseInt(m.group(4)); + } + if (m.group(6) != null) { + result += 60 * Integer.parseInt(m.group(6)); + } + if (m.group(8) != null) { + result += Integer.parseInt(m.group(8)); + } + return result; + } + + throw new KrbException("Illegal duration format " + s); + } + /** * Gets the int value for the specified keys. * @param keys the keys diff --git a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Credentials.java b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Credentials.java index 25a93772422..4b72f4f01cc 100644 --- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Credentials.java +++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/Credentials.java @@ -527,4 +527,23 @@ public class Credentials { return sb.toString(); } + public sun.security.krb5.internal.ccache.Credentials toCCacheCreds() { + return new sun.security.krb5.internal.ccache.Credentials( + getClient(), getServer(), + getSessionKey(), + date2kt(getAuthTime()), + date2kt(getStartTime()), + date2kt(getEndTime()), + date2kt(getRenewTill()), + false, + flags, + new HostAddresses(getClientAddresses()), + getAuthzData(), + getTicket(), + null); + } + + private static KerberosTime date2kt(Date d) { + return d == null ? null : new KerberosTime(d); + } } diff --git a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReq.java b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReq.java index 8de29b346ae..01fdb9bbb33 100644 --- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReq.java +++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReq.java @@ -35,6 +35,7 @@ import sun.security.krb5.internal.*; import sun.security.krb5.internal.crypto.Nonce; import sun.security.krb5.internal.crypto.KeyUsage; import java.io.IOException; +import java.time.Instant; /** * This class encapsulates the KRB-AS-REQ message that the client @@ -64,7 +65,6 @@ public class KrbAsReq { if (options == null) { options = new KDCOptions(); } - // check if they are valid arguments. The optional fields should be // consistent with settings in KDCOptions. Mar 17 2000 if (options.get(KDCOptions.FORWARDED) || @@ -82,12 +82,6 @@ public class KrbAsReq { } else { if (from != null) from = null; } - if (options.get(KDCOptions.RENEWABLE)) { - // if (rtime == null) - // throw new KrbException(Krb5.KRB_AP_ERR_REQ_OPTIONS); - } else { - if (rtime != null) rtime = null; - } PAData[] paData = null; if (pakey != null) { @@ -109,8 +103,10 @@ public class KrbAsReq { System.out.println(">>> KrbAsReq creating message"); } + Config cfg = Config.getInstance(); + // check to use addresses in tickets - if (addresses == null && Config.getInstance().useAddresses()) { + if (addresses == null && cfg.useAddresses()) { addresses = HostAddresses.getLocalAddresses(); } @@ -120,7 +116,26 @@ public class KrbAsReq { } if (till == null) { - till = new KerberosTime(0); // Choose KDC maximum allowed + String d = cfg.get("libdefaults", "ticket_lifetime"); + if (d != null) { + till = new KerberosTime(Instant.now().plusSeconds(Config.duration(d))); + } else { + till = new KerberosTime(0); // Choose KDC maximum allowed + } + } + + if (rtime == null) { + String d = cfg.get("libdefaults", "renew_lifetime"); + if (d != null) { + rtime = new KerberosTime(Instant.now().plusSeconds(Config.duration(d))); + } + } + + if (rtime != null) { + options.set(KDCOptions.RENEWABLE, true); + if (till.greaterThan(rtime)) { + rtime = till; + } } // enc-authorization-data and additional-tickets never in AS-REQ diff --git a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReqBuilder.java b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReqBuilder.java index 3c8fb904017..5b6688000f7 100644 --- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReqBuilder.java +++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbAsReqBuilder.java @@ -224,6 +224,16 @@ public final class KrbAsReqBuilder { this.options = options; } + public void setTill(KerberosTime till) { + checkState(State.INIT, "Cannot specify till"); + this.till = till; + } + + public void setRTime(KerberosTime rtime) { + checkState(State.INIT, "Cannot specify rtime"); + this.rtime = rtime; + } + /** * Sets or clears target. If cleared, KrbAsReq might choose krbtgt * for cname realm diff --git a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbException.java b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbException.java index 0d09e61c470..2690cad54c0 100644 --- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbException.java +++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbException.java @@ -96,13 +96,14 @@ public class KrbException extends Exception { public String krbErrorMessage() { - StringBuilder strbuf = new StringBuilder("krb_error " + returnCode); + StringBuilder sb = new StringBuilder(); + sb.append("krb_error ").append(returnCode); String msg = getMessage(); if (msg != null) { - strbuf.append(" "); - strbuf.append(msg); + sb.append(" "); + sb.append(msg); } - return strbuf.toString(); + return sb.toString(); } /** diff --git a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbKdcRep.java b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbKdcRep.java index dd0e951028d..4c63fe1302c 100644 --- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbKdcRep.java +++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbKdcRep.java @@ -80,49 +80,41 @@ abstract class KrbKdcRep { rep.encKDCRepPart.flags.get(KDCOptions.RENEWABLE)) { throw new KrbApErrException(Krb5.KRB_AP_ERR_MODIFIED); } - if ((req.reqBody.from == null) || req.reqBody.from.isZero()) + + if ((req.reqBody.from == null) || req.reqBody.from.isZero()) { // verify this is allowed if ((rep.encKDCRepPart.starttime != null) && - !rep.encKDCRepPart.starttime.inClockSkew()) { + !rep.encKDCRepPart.starttime.inClockSkew()) { rep.encKDCRepPart.key.destroy(); throw new KrbApErrException(Krb5.KRB_AP_ERR_SKEW); } + } - if ((req.reqBody.from != null) && !req.reqBody.from.isZero()) + if ((req.reqBody.from != null) && !req.reqBody.from.isZero()) { // verify this is allowed if ((rep.encKDCRepPart.starttime != null) && - !req.reqBody.from.equals(rep.encKDCRepPart.starttime)) { + !req.reqBody.from.equals(rep.encKDCRepPart.starttime)) { rep.encKDCRepPart.key.destroy(); throw new KrbApErrException(Krb5.KRB_AP_ERR_MODIFIED); } + } if (!req.reqBody.till.isZero() && - rep.encKDCRepPart.endtime.greaterThan(req.reqBody.till)) { + rep.encKDCRepPart.endtime.greaterThan(req.reqBody.till)) { rep.encKDCRepPart.key.destroy(); throw new KrbApErrException(Krb5.KRB_AP_ERR_MODIFIED); } - if (req.reqBody.kdcOptions.get(KDCOptions.RENEWABLE)) - if (req.reqBody.rtime != null && !req.reqBody.rtime.isZero()) - // verify this is required + if (req.reqBody.kdcOptions.get(KDCOptions.RENEWABLE)) { + if (req.reqBody.rtime != null && !req.reqBody.rtime.isZero()) { + // verify this is required if ((rep.encKDCRepPart.renewTill == null) || - rep.encKDCRepPart.renewTill.greaterThan(req.reqBody.rtime) - ) { - rep.encKDCRepPart.key.destroy(); - throw new KrbApErrException(Krb5.KRB_AP_ERR_MODIFIED); - } - - if (req.reqBody.kdcOptions.get(KDCOptions.RENEWABLE_OK) && - rep.encKDCRepPart.flags.get(KDCOptions.RENEWABLE)) - if (!req.reqBody.till.isZero()) - // verify this is required - if ((rep.encKDCRepPart.renewTill == null) || - rep.encKDCRepPart.renewTill.greaterThan(req.reqBody.till) - ) { + rep.encKDCRepPart.renewTill.greaterThan(req.reqBody.rtime) + ) { rep.encKDCRepPart.key.destroy(); throw new KrbApErrException(Krb5.KRB_AP_ERR_MODIFIED); } + } + } } - - } diff --git a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbTgsReq.java b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbTgsReq.java index 798b78d3e63..45f25e825ce 100644 --- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbTgsReq.java +++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/KrbTgsReq.java @@ -35,7 +35,6 @@ import sun.security.krb5.internal.*; import sun.security.krb5.internal.crypto.*; import java.io.IOException; import java.net.UnknownHostException; -import java.util.Arrays; /** * This class encapsulates a Kerberos TGS-REQ that is sent from the diff --git a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/HostAddresses.java b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/HostAddresses.java index 8dc9a2853e1..7f18b98f9c3 100644 --- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/HostAddresses.java +++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/HostAddresses.java @@ -250,6 +250,10 @@ public class HostAddresses implements Cloneable { */ public void writeAddrs(CCacheOutputStream cos) throws IOException { + if (addresses == null || addresses.length == 0) { + cos.write32(0); + return; + } cos.write32(addresses.length); for (int i = 0; i < addresses.length; i++) { cos.write16(addresses[i].addrType); diff --git a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/KerberosTime.java b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/KerberosTime.java index 264f2e06192..da30f9dc42c 100644 --- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/KerberosTime.java +++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/KerberosTime.java @@ -38,6 +38,7 @@ import sun.security.util.DerOutputStream; import sun.security.util.DerValue; import java.io.IOException; +import java.time.Instant; import java.util.Calendar; import java.util.Date; import java.util.TimeZone; @@ -128,6 +129,14 @@ public class KerberosTime { this(time.getTime(), 0); } + /** + * Creates a KerberosTime object from an Instant object + */ + public KerberosTime(Instant instant) { + this(instant.getEpochSecond()*1000 + instant.getNano()/1000000L, + instant.getNano()/1000%1000); + } + /** * Creates a KerberosTime object for now. It uses System.nanoTime() * to get a more precise time than "new Date()". diff --git a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java index 7bc1d650f07..af4b3aaef2c 100644 --- a/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java +++ b/jdk/src/java.security.jgss/share/classes/sun/security/krb5/internal/crypto/dk/DkCrypto.java @@ -640,8 +640,7 @@ public abstract class DkCrypto { for (int i = 0; i < digest.length; i++) { if ((digest[i] & 0x000000ff) < 0x10) { - digestString.append("0" + - Integer.toHexString(digest[i] & 0x000000ff)); + digestString.append('0').append(Integer.toHexString(digest[i] & 0x000000ff)); } else { digestString.append( Integer.toHexString(digest[i] & 0x000000ff)); diff --git a/jdk/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/Kinit.java b/jdk/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/Kinit.java index a436d585cba..5839a5e13e4 100644 --- a/jdk/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/Kinit.java +++ b/jdk/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/Kinit.java @@ -36,7 +36,6 @@ import sun.security.krb5.internal.*; import sun.security.krb5.internal.ccache.*; import java.io.IOException; import java.util.Arrays; -import javax.security.auth.kerberos.KerberosPrincipal; import sun.security.util.Password; import javax.security.auth.kerberos.KeyTab; @@ -53,22 +52,9 @@ public class Kinit { /** * The main method is used to accept user command line input for ticket - * request. - *

- * Usage: kinit [-A] [-f] [-p] [-c cachename] [[-k [-t keytab_file_name]] - * [principal] [password] - *

    - *
  • -A do not include addresses - *
  • -f forwardable - *
  • -p proxiable - *
  • -c cache name (i.e., FILE://c:\temp\mykrb5cc) - *
  • -k use keytab - *
  • -t keytab file name - *
  • principal the principal name (i.e., duke@java.sun.com) - *
  • password the principal's Kerberos password - *
- *

- * Use java sun.security.krb5.tools.Kinit -help to bring up help menu. + * request. Read {@link KinitOptions#printHelp} for usages or call + * java sun.security.krb5.internal.tools.Kinit -help + * to bring up help menu. *

* We currently support only file-based credentials cache to * store the tickets obtained from the KDC. @@ -146,6 +132,49 @@ public class Kinit { } else { options = new KinitOptions(args); } + switch (options.action) { + case 1: + acquire(); + break; + case 2: + renew(); + break; + default: + throw new KrbException("kinit does not support action " + + options.action); + } + } + + private void renew() + throws IOException, RealmException, KrbException { + + PrincipalName principal = options.getPrincipal(); + String realm = principal.getRealmAsString(); + CredentialsCache cache = CredentialsCache.getInstance(options.cachename); + + if (cache == null) { + throw new IOException("Unable to find existing cache file " + + options.cachename); + } + sun.security.krb5.internal.ccache.Credentials credentials = + cache.getCreds(PrincipalName.tgsService(realm, realm)); + + credentials = credentials.setKrbCreds() + .renew() + .toCCacheCreds(); + + cache = CredentialsCache.create(principal, options.cachename); + if (cache == null) { + throw new IOException("Unable to create the cache file " + + options.cachename); + } + cache.update(credentials); + cache.save(); + } + + private void acquire() + throws IOException, RealmException, KrbException { + String princName = null; PrincipalName principal = options.getPrincipal(); if (principal != null) { @@ -216,6 +245,9 @@ public class Kinit { if (options.getAddressOption()) builder.setAddresses(HostAddresses.getLocalAddresses()); + builder.setTill(options.lifetime); + builder.setRTime(options.renewable_lifetime); + builder.action(); sun.security.krb5.internal.ccache.Credentials credentials = diff --git a/jdk/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/KinitOptions.java b/jdk/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/KinitOptions.java index e7507a0a27f..23bfecad837 100644 --- a/jdk/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/KinitOptions.java +++ b/jdk/src/java.security.jgss/windows/classes/sun/security/krb5/internal/tools/KinitOptions.java @@ -33,12 +33,8 @@ package sun.security.krb5.internal.tools; import sun.security.krb5.*; import sun.security.krb5.internal.*; import sun.security.krb5.internal.ccache.*; -import java.io.File; import java.io.IOException; -import java.util.StringTokenizer; -import java.util.Vector; -import java.io.BufferedReader; -import java.io.InputStreamReader; +import java.time.Instant; import java.io.FileInputStream; /** @@ -49,14 +45,15 @@ import java.io.FileInputStream; * @author Ram Marti */ class KinitOptions { - public boolean validate = false; + + // 1. acquire, 2. renew, 3. validate + public int action = 1; // forwardable and proxiable flags have two states: // -1 - flag set to be not forwardable or proxiable; // 1 - flag set to be forwardable or proxiable. - public short forwardable = -1; - public short proxiable = -1; - public boolean renew = false; + public short forwardable = 0; + public short proxiable = 0; public KerberosTime lifetime; public KerberosTime renewable_lifetime; public String target_service; @@ -134,6 +131,12 @@ class KinitOptions { } useKeytab = true; + } else if (args[i].equals("-R")) { + action = 2; + } else if (args[i].equals("-l")) { + lifetime = getTime(Config.duration(args[++i])); + } else if (args[i].equals("-r")) { + renewable_lifetime = getTime(Config.duration(args[++i])); } else if (args[i].equalsIgnoreCase("-help")) { printHelp(); System.exit(0); @@ -223,23 +226,28 @@ class KinitOptions { void printHelp() { - System.out.println("Usage: kinit " + - "[-A] [-f] [-p] [-c cachename] " + - "[[-k [-t keytab_file_name]] [principal] " + + System.out.println("Usage:\n\n1. Initial ticket request:\n" + + " kinit [-A] [-f] [-p] [-c cachename] " + + "[-l lifetime] [-r renewable_time]\n" + + " [[-k [-t keytab_file_name]] [principal] " + "[password]"); - System.out.println("\tavailable options to " + + System.out.println("2. Renew a ticket:\n" + + " kinit -R [-c cachename] [principal]"); + System.out.println("\nAvailable options to " + "Kerberos 5 ticket request:"); - System.out.println("\t -A do not include addresses"); - System.out.println("\t -f forwardable"); - System.out.println("\t -p proxiable"); - System.out.println("\t -c cache name " + - "(i.e., FILE:\\d:\\myProfiles\\mykrb5cache)"); - System.out.println("\t -k use keytab"); - System.out.println("\t -t keytab file name"); - System.out.println("\t principal the principal name "+ - "(i.e., qweadf@ATHENA.MIT.EDU qweadf)"); - System.out.println("\t password " + - "the principal's Kerberos password"); + System.out.println("\t-A do not include addresses"); + System.out.println("\t-f forwardable"); + System.out.println("\t-p proxiable"); + System.out.println("\t-c cache name " + + "(i.e., FILE:\\d:\\myProfiles\\mykrb5cache)"); + System.out.println("\t-l lifetime"); + System.out.println("\t-r renewable time " + + "(total lifetime a ticket can be renewed)"); + System.out.println("\t-k use keytab"); + System.out.println("\t-t keytab file name"); + System.out.println("\tprincipal the principal name "+ + "(i.e., qweadf@ATHENA.MIT.EDU qweadf)"); + System.out.println("\tpassword the principal's Kerberos password"); } public boolean getAddressOption() { @@ -257,4 +265,8 @@ class KinitOptions { public PrincipalName getPrincipal() { return principal; } + + private KerberosTime getTime(int s) { + return new KerberosTime(Instant.now().plusSeconds(s)); + } } diff --git a/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/CramMD5Base.java b/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/CramMD5Base.java index 1b5a653acba..3e0e6ba3d57 100644 --- a/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/CramMD5Base.java +++ b/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/CramMD5Base.java @@ -196,8 +196,7 @@ abstract class CramMD5Base { for (i = 0; i < digest.length; i++) { if ((digest[i] & 0x000000ff) < 0x10) { - digestString.append("0" + - Integer.toHexString(digest[i] & 0x000000ff)); + digestString.append('0').append(Integer.toHexString(digest[i] & 0x000000ff)); } else { digestString.append( Integer.toHexString(digest[i] & 0x000000ff)); diff --git a/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java b/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java index 24262fca0c6..138f21509ae 100644 --- a/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java +++ b/jdk/src/java.security.sasl/share/classes/com/sun/security/sasl/digest/DigestMD5Base.java @@ -391,8 +391,7 @@ abstract class DigestMD5Base extends AbstractSaslImpl { for (int i = 0; i < digest.length; i ++) { if ((digest[i] & 0x000000ff) < 0x10) { - digestString.append("0"+ - Integer.toHexString(digest[i] & 0x000000ff)); + digestString.append('0').append(Integer.toHexString(digest[i] & 0x000000ff)); } else { digestString.append( Integer.toHexString(digest[i] & 0x000000ff)); diff --git a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/encryption/AbstractSerializer.java b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/encryption/AbstractSerializer.java index a21f1488ec7..33c07d73a4c 100644 --- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/encryption/AbstractSerializer.java +++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/encryption/AbstractSerializer.java @@ -235,14 +235,15 @@ public abstract class AbstractSerializer implements Serializer { String nodeName = att.getNodeName(); if ((nodeName.equals("xmlns") || nodeName.startsWith("xmlns:")) && !storedNamespaces.containsKey(att.getNodeName())) { - sb.append(" " + nodeName + "=\"" + att.getNodeValue() + "\""); + sb.append(' ').append(nodeName).append("=\"") + .append(att.getNodeValue()).append('"'); storedNamespaces.put(nodeName, att.getNodeValue()); } } } wk = wk.getParentNode(); } - sb.append(">" + source + ""); + sb.append('>').append(source).append(""); return sb.toString(); } diff --git a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/transforms/params/InclusiveNamespaces.java b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/transforms/params/InclusiveNamespaces.java index 2b6f5da2f16..4582819afc7 100644 --- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/transforms/params/InclusiveNamespaces.java +++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/transforms/params/InclusiveNamespaces.java @@ -85,7 +85,7 @@ public class InclusiveNamespaces extends ElementProxy implements TransformParam if (prefix.equals("xmlns")) { sb.append("#default "); } else { - sb.append(prefix + " "); + sb.append(prefix).append(' '); } } diff --git a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/RFC2253Parser.java b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/RFC2253Parser.java index 1ab91701b6a..803a3e97e52 100644 --- a/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/RFC2253Parser.java +++ b/jdk/src/java.xml.crypto/share/classes/com/sun/org/apache/xml/internal/security/utils/RFC2253Parser.java @@ -88,7 +88,7 @@ public class RFC2253Parser { l += countQuotes(DN, j, k); if ((k > 0) && (DN.charAt(k - 1) != '\\') && (l % 2) == 0) { - sb.append(parseRDN(DN.substring(i, k).trim(), toXml) + ","); + sb.append(parseRDN(DN.substring(i, k).trim(), toXml)).append(','); i = k + 1; l = 0; @@ -121,7 +121,7 @@ public class RFC2253Parser { l += countQuotes(str, j, k); if ((k > 0) && (str.charAt(k - 1) != '\\') && (l % 2) == 0) { - sb.append(parseATAV(trim(str.substring(i, k)), toXml) + "+"); + sb.append(parseATAV(trim(str.substring(i, k)), toXml)).append('+'); i = k + 1; l = 0; @@ -369,7 +369,7 @@ public class RFC2253Parser { int k; for (int j = 0; (k = string.indexOf("\\20", j)) >= 0; j = k + 3) { - sb.append(trim(string.substring(i, k)) + "\\ "); + sb.append(trim(string.substring(i, k))).append("\\ "); i = k + 3; } @@ -418,7 +418,7 @@ public class RFC2253Parser { l += countQuotes(str, j, k); if ((k > 0) && (str.charAt(k - 1) != '\\') && (l % 2) == 0) { - sb.append(trim(str.substring(i, k)) + replace); + sb.append(trim(str.substring(i, k))).append(replace); i = k + 1; l = 0; diff --git a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Key.java b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Key.java index 235c1488a44..652bf0cbd92 100644 --- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Key.java +++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Key.java @@ -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 @@ -445,6 +445,7 @@ abstract class P11Key implements Key, Length { } } + @SuppressWarnings("deprecation") private static class P11TlsMasterSecretKey extends P11SecretKey implements TlsMasterSecret { private static final long serialVersionUID = -1318560923770573441L; diff --git a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11RSACipher.java b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11RSACipher.java index 253b8913a82..bc65e2f2424 100644 --- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11RSACipher.java +++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11RSACipher.java @@ -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 @@ -169,6 +169,7 @@ final class P11RSACipher extends CipherSpi { } // see JCE spec + @SuppressWarnings("deprecation") protected void engineInit(int opmode, Key key, AlgorithmParameterSpec params, SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException { @@ -461,6 +462,7 @@ final class P11RSACipher extends CipherSpi { } // see JCE spec + @SuppressWarnings("deprecation") protected Key engineUnwrap(byte[] wrappedKey, String algorithm, int type) throws InvalidKeyException, NoSuchAlgorithmException { diff --git a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Signature.java b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Signature.java index 1bac22ca62c..e5f498ffc71 100644 --- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Signature.java +++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11Signature.java @@ -765,12 +765,14 @@ final class P11Signature extends SignatureSpi { } // see JCA spec + @SuppressWarnings("deprecation") protected void engineSetParameter(String param, Object value) throws InvalidParameterException { throw new UnsupportedOperationException("setParameter() not supported"); } // see JCA spec + @SuppressWarnings("deprecation") protected Object engineGetParameter(String param) throws InvalidParameterException { throw new UnsupportedOperationException("getParameter() not supported"); diff --git a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsKeyMaterialGenerator.java b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsKeyMaterialGenerator.java index babebabf008..c054f312c55 100644 --- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsKeyMaterialGenerator.java +++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsKeyMaterialGenerator.java @@ -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 @@ -62,6 +62,7 @@ public final class P11TlsKeyMaterialGenerator extends KeyGeneratorSpi { private long mechanism; // parameter spec + @SuppressWarnings("deprecation") private TlsKeyMaterialParameterSpec spec; // master secret as a P11Key @@ -82,6 +83,7 @@ public final class P11TlsKeyMaterialGenerator extends KeyGeneratorSpi { throw new InvalidParameterException(MSG); } + @SuppressWarnings("deprecation") protected void engineInit(AlgorithmParameterSpec params, SecureRandom random) throws InvalidAlgorithmParameterException { if (params instanceof TlsKeyMaterialParameterSpec == false) { @@ -107,6 +109,7 @@ public final class P11TlsKeyMaterialGenerator extends KeyGeneratorSpi { throw new InvalidParameterException(MSG); } + @SuppressWarnings("deprecation") protected SecretKey engineGenerateKey() { if (spec == null) { throw new IllegalStateException diff --git a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsMasterSecretGenerator.java b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsMasterSecretGenerator.java index ef30daf41fc..73a2ac2e890 100644 --- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsMasterSecretGenerator.java +++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsMasterSecretGenerator.java @@ -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 @@ -57,6 +57,7 @@ public final class P11TlsMasterSecretGenerator extends KeyGeneratorSpi { // mechanism id private long mechanism; + @SuppressWarnings("deprecation") private TlsMasterSecretParameterSpec spec; private P11Key p11Key; @@ -74,6 +75,7 @@ public final class P11TlsMasterSecretGenerator extends KeyGeneratorSpi { throw new InvalidParameterException(MSG); } + @SuppressWarnings("deprecation") protected void engineInit(AlgorithmParameterSpec params, SecureRandom random) throws InvalidAlgorithmParameterException { if (params instanceof TlsMasterSecretParameterSpec == false) { diff --git a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsPrfGenerator.java b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsPrfGenerator.java index 86bee16a72f..739f66965d4 100644 --- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsPrfGenerator.java +++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsPrfGenerator.java @@ -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,6 +63,7 @@ final class P11TlsPrfGenerator extends KeyGeneratorSpi { // mechanism id private final long mechanism; + @SuppressWarnings("deprecation") private TlsPrfParameterSpec spec; private P11Key p11Key; @@ -79,6 +80,7 @@ final class P11TlsPrfGenerator extends KeyGeneratorSpi { throw new InvalidParameterException(MSG); } + @SuppressWarnings("deprecation") protected void engineInit(AlgorithmParameterSpec params, SecureRandom random) throws InvalidAlgorithmParameterException { if (params instanceof TlsPrfParameterSpec == false) { diff --git a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java index 21c853794bc..40d3a634ce5 100644 --- a/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java +++ b/jdk/src/jdk.crypto.pkcs11/share/classes/sun/security/pkcs11/P11TlsRsaPremasterSecretGenerator.java @@ -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 @@ -57,6 +57,7 @@ final class P11TlsRsaPremasterSecretGenerator extends KeyGeneratorSpi { // mechanism id private long mechanism; + @SuppressWarnings("deprecation") private TlsRsaPremasterSecretParameterSpec spec; P11TlsRsaPremasterSecretGenerator(Token token, String algorithm, long mechanism) @@ -71,6 +72,7 @@ final class P11TlsRsaPremasterSecretGenerator extends KeyGeneratorSpi { throw new InvalidParameterException(MSG); } + @SuppressWarnings("deprecation") protected void engineInit(AlgorithmParameterSpec params, SecureRandom random) throws InvalidAlgorithmParameterException { if (!(params instanceof TlsRsaPremasterSecretParameterSpec)) { diff --git a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaValueArray.java b/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaValueArray.java index d1795328773..f03fd68b82a 100644 --- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaValueArray.java +++ b/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/model/JavaValueArray.java @@ -346,12 +346,12 @@ public class JavaValueArray extends JavaLazyReadObject public String valueString(boolean bigLimit) { // Char arrays deserve special treatment - StringBuffer result; + StringBuilder result; byte[] value = getValue(); int max = value.length; byte elementSignature = getElementType(); if (elementSignature == 'C') { - result = new StringBuffer(); + result = new StringBuilder(); for (int i = 0; i < value.length; ) { char val = charAt(i, value); result.append(val); @@ -362,7 +362,7 @@ public class JavaValueArray extends JavaLazyReadObject if (bigLimit) { limit = 1000; } - result = new StringBuffer("{"); + result = new StringBuilder("{"); int num = 0; for (int i = 0; i < value.length; ) { if (num > 0) { @@ -386,37 +386,37 @@ public class JavaValueArray extends JavaLazyReadObject } case 'B': { int val = 0xFF & byteAt(i, value); - result.append("0x" + Integer.toString(val, 16)); + result.append("0x").append(Integer.toString(val, 16)); i++; break; } case 'S': { short val = shortAt(i, value); i += 2; - result.append("" + val); + result.append(val); break; } case 'I': { int val = intAt(i, value); i += 4; - result.append("" + val); + result.append(val); break; } case 'J': { // long long val = longAt(i, value); - result.append("" + val); + result.append(val); i += 8; break; } case 'F': { float val = floatAt(i, value); - result.append("" + val); + result.append(val); i += 4; break; } case 'D': { // double double val = doubleAt(i, value); - result.append("" + val); + result.append(val); i += 8; break; } @@ -425,7 +425,7 @@ public class JavaValueArray extends JavaLazyReadObject } } } - result.append("}"); + result.append('}'); } return result.toString(); } diff --git a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/Misc.java b/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/Misc.java index 84a9291003c..943342c7c57 100644 --- a/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/Misc.java +++ b/jdk/src/jdk.dev/share/classes/com/sun/tools/hat/internal/util/Misc.java @@ -97,11 +97,11 @@ public class Misc { } else if (ch == '&') { sb.append("&"); } else if (ch < ' ') { - sb.append("&#" + Integer.toString(ch) + ";"); + sb.append("&#").append((int)ch).append(';'); } else { int c = (ch & 0xFFFF); if (c > 127) { - sb.append("&#" + Integer.toString(c) + ";"); + sb.append("&#").append(c).append(';'); } else { sb.append(ch); } diff --git a/jdk/src/jdk.dev/share/classes/sun/security/tools/jarsigner/Main.java b/jdk/src/jdk.dev/share/classes/sun/security/tools/jarsigner/Main.java index 4c4f86e2470..12483c8b357 100644 --- a/jdk/src/jdk.dev/share/classes/sun/security/tools/jarsigner/Main.java +++ b/jdk/src/jdk.dev/share/classes/sun/security/tools/jarsigner/Main.java @@ -676,14 +676,13 @@ public class Main { ((man.getAttributes(name) != null) || (man.getAttributes("./"+name) != null) || (man.getAttributes("/"+name) != null)); - sb.append( - (isSigned ? rb.getString("s") : rb.getString("SPACE")) + - (inManifest ? rb.getString("m") : rb.getString("SPACE")) + - (inStore ? rb.getString("k") : rb.getString("SPACE")) + - (inScope ? rb.getString("i") : rb.getString("SPACE")) + - ((inStoreOrScope & NOT_ALIAS) != 0 ?"X":" ") + - rb.getString("SPACE")); - sb.append("|"); + sb.append(isSigned ? rb.getString("s") : rb.getString("SPACE")) + .append(inManifest ? rb.getString("m") : rb.getString("SPACE")) + .append(inStore ? rb.getString("k") : rb.getString("SPACE")) + .append(inScope ? rb.getString("i") : rb.getString("SPACE")) + .append((inStoreOrScope & NOT_ALIAS) != 0 ? 'X' : ' ') + .append(rb.getString("SPACE")); + sb.append('|'); } // When -certs provided, display info has extra empty @@ -704,11 +703,15 @@ public class Main { // Print no info for unsigned entries when -verbose:all, // to be consistent with old behavior. if (signatureRelated(name)) { - sb.append("\n" + tab + rb.getString( - ".Signature.related.entries.") + "\n\n"); + sb.append('\n') + .append(tab) + .append(rb + .getString(".Signature.related.entries.")) + .append("\n\n"); } else { - sb.append("\n" + tab + rb.getString( - ".Unsigned.entries.") + "\n\n"); + sb.append('\n').append(tab) + .append(rb.getString(".Unsigned.entries.")) + .append("\n\n"); } } @@ -1605,8 +1608,8 @@ public class Main { // No more warning, we alreay have hasExpiredCert or notYetValidCert } else { chainNotValidated = true; - sb.append(tab + rb.getString(".CertPath.not.validated.") + - e.getLocalizedMessage() + "]\n"); // TODO + sb.append(tab).append(rb.getString(".CertPath.not.validated.")) + .append(e.getLocalizedMessage()).append("]\n"); // TODO } } String result = sb.toString(); diff --git a/jdk/src/jdk.jcmd/share/classes/sun/tools/jps/Jps.java b/jdk/src/jdk.jcmd/share/classes/sun/tools/jps/Jps.java index 33125516690..67369b7abb7 100644 --- a/jdk/src/jdk.jcmd/share/classes/sun/tools/jps/Jps.java +++ b/jdk/src/jdk.jcmd/share/classes/sun/tools/jps/Jps.java @@ -92,28 +92,28 @@ public class Jps { vm = monitoredHost.getMonitoredVm(id, 0); errorString = " -- main class information unavailable"; - output.append(" " + MonitoredVmUtil.mainClass(vm, + output.append(' ').append(MonitoredVmUtil.mainClass(vm, arguments.showLongPaths())); if (arguments.showMainArgs()) { errorString = " -- main args information unavailable"; String mainArgs = MonitoredVmUtil.mainArgs(vm); if (mainArgs != null && mainArgs.length() > 0) { - output.append(" " + mainArgs); + output.append(' ').append(mainArgs); } } if (arguments.showVmArgs()) { errorString = " -- jvm args information unavailable"; String jvmArgs = MonitoredVmUtil.jvmArgs(vm); if (jvmArgs != null && jvmArgs.length() > 0) { - output.append(" " + jvmArgs); + output.append(' ').append(jvmArgs); } } if (arguments.showVmFlags()) { errorString = " -- jvm flags information unavailable"; String jvmFlags = MonitoredVmUtil.jvmFlags(vm); if (jvmFlags != null && jvmFlags.length() > 0) { - output.append(" " + jvmFlags); + output.append(' ').append(jvmFlags); } } diff --git a/jdk/src/jdk.jcmd/share/classes/sun/tools/jstat/RawOutputFormatter.java b/jdk/src/jdk.jcmd/share/classes/sun/tools/jstat/RawOutputFormatter.java index 614af446348..cbd129cbe50 100644 --- a/jdk/src/jdk.jcmd/share/classes/sun/tools/jstat/RawOutputFormatter.java +++ b/jdk/src/jdk.jcmd/share/classes/sun/tools/jstat/RawOutputFormatter.java @@ -50,7 +50,7 @@ public class RawOutputFormatter implements OutputFormatter { StringBuilder headerBuilder = new StringBuilder(); for (Iterator i = logged.iterator(); i.hasNext(); /* empty */ ) { Monitor m = i.next(); - headerBuilder.append(m.getName() + " "); + headerBuilder.append(m.getName()).append(' '); } header = headerBuilder.toString(); } diff --git a/jdk/src/jdk.jcmd/share/classes/sun/tools/jstat/SyntaxException.java b/jdk/src/jdk.jcmd/share/classes/sun/tools/jstat/SyntaxException.java index 1e1b2a1fe4e..540cb540761 100644 --- a/jdk/src/jdk.jcmd/share/classes/sun/tools/jstat/SyntaxException.java +++ b/jdk/src/jdk.jcmd/share/classes/sun/tools/jstat/SyntaxException.java @@ -65,24 +65,21 @@ public class SyntaxException extends ParserException { public SyntaxException(int lineno, Set expected, Token found) { StringBuilder msg = new StringBuilder(); - msg.append("Syntax error at line " + lineno + ": Expected one of \'"); + msg.append("Syntax error at line ").append(lineno) + .append(": Expected one of \'"); - boolean first = true; - for (Iterator i = expected.iterator(); i.hasNext(); /* empty */) { - String keyWord = i.next(); - if (first) { - msg.append(keyWord); - first = false; - } else { - msg.append("|" + keyWord); - } + for (String keyWord : expected) { + msg.append(keyWord).append('|'); + } + if (!expected.isEmpty()) { + msg.setLength(msg.length() - 1); } - msg.append("\', Found " + found.toMessage()); - message = msg.toString(); + message = msg.append("\', Found ").append(found.toMessage()).toString(); } public String getMessage() { return message; } } + diff --git a/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/ThreadTab.java b/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/ThreadTab.java index a38b9d68408..7f8236d9b2a 100644 --- a/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/ThreadTab.java +++ b/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/ThreadTab.java @@ -368,7 +368,7 @@ class ThreadTab extends Tab implements ActionListener, DocumentListener, ListSel sb.append(Messages.STACK_TRACE); int index = 0; for (StackTraceElement e : ti.getStackTrace()) { - sb.append(e.toString()+"\n"); + sb.append(e).append('\n'); if (monitors != null) { for (MonitorInfo mi : monitors) { if (mi.getLockedStackDepth() == index) { diff --git a/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/inspector/XArrayDataViewer.java b/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/inspector/XArrayDataViewer.java index 58f795cef21..3c1bfd8f799 100644 --- a/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/inspector/XArrayDataViewer.java +++ b/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/inspector/XArrayDataViewer.java @@ -79,25 +79,25 @@ class XArrayDataViewer { String textColor = String.format("%06x", foreground.getRGB() & 0xFFFFFF); StringBuilder sb = new StringBuilder(); - sb.append(""); + sb.append("
"); for (int i = 0; i < arr.length; i++) { if (i % 2 == 0) { - sb.append(""); + sb.append(""); } else { - sb.append(""); + sb.append(""); } } if (arr.length == 0) { - sb.append(""); + sb.append(""); } sb.append("
" +
-                            (arr[i] == null ?
-                                arr[i] : htmlize(arr[i].toString())) +
-                            "
")
+                            .append(arr[i] == null ?
+                                    arr[i] : htmlize(arr[i].toString()))
+                      .append("
" +
-                            (arr[i] == null ?
-                                arr[i] : htmlize(arr[i].toString())) +
-                            "
")
+                            .append(arr[i] == null ?
+                                    arr[i] : htmlize(arr[i].toString()))
+                            .append("
"); arrayEditor.setText(sb.toString()); diff --git a/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/inspector/XTree.java b/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/inspector/XTree.java index ed5658cc9ae..aaa1ab6a6bd 100644 --- a/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/inspector/XTree.java +++ b/jdk/src/jdk.jconsole/share/classes/sun/tools/jconsole/inspector/XTree.java @@ -507,13 +507,13 @@ public class XTree extends JTree { // key order defined by the "orderedKeyPropertyList" for (String key : orderedKeyPropertyList) { if (map.containsKey(key)) { - sb.append(key + "=" + map.get(key) + ","); + sb.append(key).append('=').append(map.get(key)).append(','); map.remove(key); } } // Add the remaining key/value pairs to the buffer for (Map.Entry entry : map.entrySet()) { - sb.append(entry.getKey() + "=" + entry.getValue() + ","); + sb.append(entry.getKey()).append('=').append(entry.getValue()).append(','); } String orderedKeyPropertyListString = sb.toString(); orderedKeyPropertyListString = orderedKeyPropertyListString.substring( @@ -622,7 +622,7 @@ public class XTree extends JTree { // StringBuilder sb = new StringBuilder(); for (MBeanParameterInfo mbpi : mboi.getSignature()) { - sb.append(mbpi.getType() + ","); + sb.append(mbpi.getType()).append(','); } String signature = sb.toString(); if (signature.length() > 0) { diff --git a/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/ExpressionParser.java b/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/ExpressionParser.java index 4005adc4262..c0c22e8f3ec 100644 --- a/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/ExpressionParser.java +++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/ExpressionParser.java @@ -59,6 +59,7 @@ public class ExpressionParser implements ExpressionParserConstants { StackFrame get() throws IncompatibleThreadStateException; } + @SuppressWarnings("deprecation") public static Value evaluate(String expr, VirtualMachine vm, GetFrame frameGetter) throws ParseException, InvocationException, diff --git a/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/ParseException.java b/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/ParseException.java index 77b0980c282..7af191a10f7 100644 --- a/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/ParseException.java +++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/ParseException.java @@ -198,7 +198,7 @@ public class ParseException extends Exception { default: if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { String s = "0000" + Integer.toString(ch, 16); - retval.append("\\u" + s.substring(s.length() - 4, s.length())); + retval.append("\\u").append(s.substring(s.length() - 4, s.length())); } else { retval.append(ch); } diff --git a/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/TokenMgrError.java b/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/TokenMgrError.java index f6408697b48..675a46be27e 100644 --- a/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/TokenMgrError.java +++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/example/debug/expr/TokenMgrError.java @@ -107,7 +107,7 @@ public class TokenMgrError extends Error default: if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { String s = "0000" + Integer.toString(ch, 16); - retval.append("\\u" + s.substring(s.length() - 4, s.length())); + retval.append("\\u").append(s.substring(s.length() - 4, s.length())); } else { retval.append(ch); } diff --git a/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java b/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java index c03ed4de31b..6a0eeb688be 100644 --- a/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java +++ b/jdk/src/jdk.jdi/share/classes/com/sun/tools/jdi/VirtualMachineImpl.java @@ -881,12 +881,12 @@ class VirtualMachineImpl extends MirrorImpl } else if (tag == JDWP.TypeTag.ARRAY) { sb.append("ArrayType"); } else { - sb.append("UNKNOWN TAG: " + tag); + sb.append("UNKNOWN TAG: ").append(tag); } if (signature != null) { - sb.append(", signature='" + signature + "'"); + sb.append(", signature='").append(signature).append('\''); } - sb.append(", id=" + id); + sb.append(", id=").append(id); vm.printTrace(sb.toString()); } if (id == 0) { diff --git a/jdk/src/jdk.jdwp.agent/share/native/libjdwp/transport.c b/jdk/src/jdk.jdwp.agent/share/native/libjdwp/transport.c index c05d39c4267..b8e47acdf41 100644 --- a/jdk/src/jdk.jdwp.agent/share/native/libjdwp/transport.c +++ b/jdk/src/jdk.jdwp.agent/share/native/libjdwp/transport.c @@ -66,8 +66,10 @@ printLastError(jdwpTransportEnv *t, jdwpTransportError err) len = (int)strlen(msg); maxlen = len+len/2+2; /* Should allow for plenty of room */ utf8msg = (jbyte*)jvmtiAllocate(maxlen+1); - (void)utf8FromPlatform(msg, len, utf8msg, maxlen); - utf8msg[maxlen] = 0; + if (utf8msg != NULL) { + (void)utf8FromPlatform(msg, len, utf8msg, maxlen); + utf8msg[maxlen] = 0; + } } if (rv == JDWPTRANSPORT_ERROR_NONE) { ERROR_MESSAGE(("transport error %d: %s",err, utf8msg)); @@ -391,6 +393,10 @@ launch(char *command, char *name, char *address) /* Convert commandLine from UTF-8 to platform encoding */ len = (int)strlen(commandLine); buf = jvmtiAllocate(len*3+3); + if (buf == NULL) { + jvmtiDeallocate(commandLine); + return JDWP_ERROR(OUT_OF_MEMORY); + } (void)utf8ToPlatform((jbyte*)commandLine, len, buf, len*3+3); /* Exec commandLine */ @@ -447,21 +453,23 @@ transport_startTransport(jboolean isServer, char *name, char *address, if (info == NULL) { return JDWP_ERROR(OUT_OF_MEMORY); } - info->name = jvmtiAllocate((int)strlen(name)+1); - (void)strcpy(info->name, name); - info->address = NULL; info->timeout = timeout; + + info->name = jvmtiAllocate((int)strlen(name)+1); if (info->name == NULL) { serror = JDWP_ERROR(OUT_OF_MEMORY); goto handleError; } + (void)strcpy(info->name, name); + + info->address = NULL; if (address != NULL) { info->address = jvmtiAllocate((int)strlen(address)+1); - (void)strcpy(info->address, address); if (info->address == NULL) { serror = JDWP_ERROR(OUT_OF_MEMORY); goto handleError; } + (void)strcpy(info->address, address); } info->transport = trans; @@ -478,6 +486,10 @@ transport_startTransport(jboolean isServer, char *name, char *address, */ len = (int)strlen(name) + (int)strlen(retAddress) + 2; /* ':' and '\0' */ prop_value = (char*)jvmtiAllocate(len); + if (prop_value == NULL) { + serror = JDWP_ERROR(OUT_OF_MEMORY); + goto handleError; + } strcpy(prop_value, name); strcat(prop_value, ":"); strcat(prop_value, retAddress); diff --git a/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/PerfDataBufferImpl.java b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/PerfDataBufferImpl.java index 2bde91cf719..db72e654735 100644 --- a/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/PerfDataBufferImpl.java +++ b/jdk/src/jdk.jvmstat/share/classes/sun/jvmstat/perfdata/monitor/PerfDataBufferImpl.java @@ -158,6 +158,7 @@ public abstract class PerfDataBufferImpl { * the sun.jvmstat.perfdata.aliasmap file indicates some other * file as the source. */ + @SuppressWarnings("deprecation") private void buildAliasMap() { assert Thread.holdsLock(this); diff --git a/jdk/src/jdk.jvmstat/share/classes/sun/tools/jstatd/Jstatd.java b/jdk/src/jdk.jvmstat/share/classes/sun/tools/jstatd/Jstatd.java index 22238e70142..09a17803cfa 100644 --- a/jdk/src/jdk.jvmstat/share/classes/sun/tools/jstatd/Jstatd.java +++ b/jdk/src/jdk.jvmstat/share/classes/sun/tools/jstatd/Jstatd.java @@ -76,6 +76,7 @@ public class Jstatd { } } + @SuppressWarnings("deprecation") // Use of RMISecurityManager public static void main(String[] args) { String rminame = null; int argc = 0; diff --git a/jdk/src/jdk.jvmstat/share/classes/sun/tools/jstatd/RemoteHostImpl.java b/jdk/src/jdk.jvmstat/share/classes/sun/tools/jstatd/RemoteHostImpl.java index a35465fe8af..20368a4cc0d 100644 --- a/jdk/src/jdk.jvmstat/share/classes/sun/tools/jstatd/RemoteHostImpl.java +++ b/jdk/src/jdk.jvmstat/share/classes/sun/tools/jstatd/RemoteHostImpl.java @@ -68,7 +68,7 @@ public class RemoteHostImpl implements RemoteHost, HostListener { sb.append("local://").append(lvmid).append("@localhost"); if (mode != null) { - sb.append("?mode=" + mode); + sb.append("?mode=").append(mode); } String vmidStr = sb.toString(); diff --git a/jdk/src/jdk.naming.dns/share/classes/sun/net/spi/nameservice/dns/DNSNameService.java b/jdk/src/jdk.naming.dns/share/classes/sun/net/spi/nameservice/dns/DNSNameService.java index 2abeddc5d88..647ef007c2f 100644 --- a/jdk/src/jdk.naming.dns/share/classes/sun/net/spi/nameservice/dns/DNSNameService.java +++ b/jdk/src/jdk.naming.dns/share/classes/sun/net/spi/nameservice/dns/DNSNameService.java @@ -463,12 +463,12 @@ public final class DNSNameService implements NameService { // --------- - private static void appendIfLiteralAddress(String addr, StringBuffer sb) { + private static void appendIfLiteralAddress(String addr, StringBuilder sb) { if (IPAddressUtil.isIPv4LiteralAddress(addr)) { - sb.append("dns://" + addr + " "); + sb.append("dns://").append(addr).append(' '); } else { if (IPAddressUtil.isIPv6LiteralAddress(addr)) { - sb.append("dns://[" + addr + "] "); + sb.append("dns://[").append(addr).append("] "); } } } @@ -478,7 +478,7 @@ public final class DNSNameService implements NameService { * corresponding to the supplied List of nameservers. */ private static String createProviderURL(List nsList) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); for (String s: nsList) { appendIfLiteralAddress(s, sb); } @@ -491,7 +491,7 @@ public final class DNSNameService implements NameService { * contained in the provided str. */ private static String createProviderURL(String str) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); StringTokenizer st = new StringTokenizer(str, ","); while (st.hasMoreTokens()) { appendIfLiteralAddress(st.nextToken(), sb); diff --git a/jdk/src/jdk.naming.rmi/share/classes/com/sun/jndi/rmi/registry/RegistryContext.java b/jdk/src/jdk.naming.rmi/share/classes/com/sun/jndi/rmi/registry/RegistryContext.java index a6de4af5cd8..cf3de07fe79 100644 --- a/jdk/src/jdk.naming.rmi/share/classes/com/sun/jndi/rmi/registry/RegistryContext.java +++ b/jdk/src/jdk.naming.rmi/share/classes/com/sun/jndi/rmi/registry/RegistryContext.java @@ -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 @@ -353,6 +353,7 @@ public class RegistryContext implements Context, Referenceable { /** * Wrap a RemoteException inside a NamingException. */ + @SuppressWarnings("deprecation") public static NamingException wrapRemoteException(RemoteException re) { NamingException ne; @@ -413,6 +414,7 @@ public class RegistryContext implements Context, Referenceable { * Attempts to install a security manager if none is currently in * place. */ + @SuppressWarnings("deprecation") private static void installSecurityMgr() { try { diff --git a/jdk/src/jdk.runtime/share/classes/sun/security/tools/policytool/PolicyTool.java b/jdk/src/jdk.runtime/share/classes/sun/security/tools/policytool/PolicyTool.java index ad5603d2eb8..fde04357822 100644 --- a/jdk/src/jdk.runtime/share/classes/sun/security/tools/policytool/PolicyTool.java +++ b/jdk/src/jdk.runtime/share/classes/sun/security/tools/policytool/PolicyTool.java @@ -980,8 +980,9 @@ class PolicyEntry { grantEntry.principals.listIterator(); while (list.hasNext()) { PolicyParser.PrincipalEntry pppe = list.next(); - sb.append(" Principal " + pppe.getDisplayClass() + " " + - pppe.getDisplayName(true)); + sb.append(" Principal ").append(pppe.getDisplayClass()) + .append(' ') + .append(pppe.getDisplayName(true)); if (list.hasNext()) sb.append(", "); } result = sb.toString(); diff --git a/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipUtils.java b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipUtils.java index 0e3584e89c9..114dc4523d3 100644 --- a/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipUtils.java +++ b/jdk/src/jdk.zipfs/share/classes/jdk/nio/zipfs/ZipUtils.java @@ -103,6 +103,7 @@ class ZipUtils { /* * Converts DOS time to Java time (number of milliseconds since epoch). */ + @SuppressWarnings("deprecation") public static long dosToJavaTime(long dtime) { Date d = new Date((int)(((dtime >> 25) & 0x7f) + 80), (int)(((dtime >> 21) & 0x0f) - 1), @@ -116,6 +117,7 @@ class ZipUtils { /* * Converts Java time to DOS time. */ + @SuppressWarnings("deprecation") public static long javaToDosTime(long time) { Date d = new Date(time); int year = d.getYear() + 1900; diff --git a/jdk/test/Makefile b/jdk/test/Makefile index 71053da52fd..52700cd58d0 100644 --- a/jdk/test/Makefile +++ b/jdk/test/Makefile @@ -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 @@ -258,6 +258,11 @@ jdk_% core_% svc_%: # ------------------------------------------------------------------ +# When called from JPRT the TESTDIRS variable is set to the jtreg tests to run +ifdef TESTDIRS + TEST_SELECTION = $(TESTDIRS) +endif + ifdef CONCURRENCY EXTRA_JTREG_OPTIONS += -concurrency:$(CONCURRENCY) endif diff --git a/jdk/test/com/sun/jndi/ldap/LdapTimeoutTest.java b/jdk/test/com/sun/jndi/ldap/LdapTimeoutTest.java index 092416eff3e..9a5580028a4 100644 --- a/jdk/test/com/sun/jndi/ldap/LdapTimeoutTest.java +++ b/jdk/test/com/sun/jndi/ldap/LdapTimeoutTest.java @@ -28,144 +28,59 @@ * @summary Timeout tests for ldap */ -import com.sun.jndi.ldap.Connection; - import java.net.Socket; import java.net.ServerSocket; import java.net.SocketTimeoutException; import java.io.*; import javax.naming.*; import javax.naming.directory.*; +import java.util.List; import java.util.Hashtable; +import java.util.ArrayList; import java.util.concurrent.Callable; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.TimeUnit; import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.NANOSECONDS; -public class LdapTimeoutTest { - static volatile int passed = 0, failed = 0; - static void pass() {passed++;} - static void fail() {failed++; Thread.dumpStack();} +abstract class LdapTest implements Callable { - public static void main(String[] args) throws Exception { - ServerSocket serverSock = new ServerSocket(0); - Server s = new Server(serverSock); - s.start(); - Thread.sleep(200); + Hashtable env; + TestServer server; + ScheduledExecutorService killSwitchPool; + boolean passed = false; + private int HANGING_TEST_TIMEOUT = 20_000; - Hashtable env = new Hashtable(11); - env.put(Context.INITIAL_CONTEXT_FACTORY, - "com.sun.jndi.ldap.LdapCtxFactory"); - env.put(Context.PROVIDER_URL, "ldap://localhost:" + - serverSock.getLocalPort()); - - env.put(Context.SECURITY_AUTHENTICATION,"simple"); - - env.put(Context.SECURITY_PRINCIPAL, "user"); - env.put(Context.SECURITY_CREDENTIALS, "password"); - - 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); - } finally { - s.interrupt(); - } - - System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); - if (failed > 0) throw new AssertionError("Some tests failed"); + public LdapTest (TestServer server, Hashtable env) { + this.server = server; + this.env = env; } - void ldapReadTimeoutTest(Hashtable env, boolean ssl) { - InitialContext ctx = null; - if (ssl) env.put(Context.SECURITY_PROTOCOL, "ssl"); - long start = System.nanoTime(); - try { - ctx = new InitialDirContext(env); - SearchControls scl = new SearchControls(); - scl.setSearchScope(SearchControls.SUBTREE_SCOPE); - NamingEnumeration answer = ((InitialDirContext)ctx) - .search("ou=People,o=JNDITutorial", "(objectClass=*)", scl); - // shouldn't reach here - fail(); - } catch (NamingException e) { - if (ssl) { - if (e.getCause() instanceof SocketTimeoutException) { - pass(); - } else if (e.getCause() instanceof InterruptedIOException) { - Thread.interrupted(); - fail(); - } - } else { - pass(); - } - } finally { - if (!shutItDown(ctx)) fail(); - } + public LdapTest(TestServer server, Hashtable env, + ScheduledExecutorService killSwitchPool) + { + this(server, env); + this.killSwitchPool = killSwitchPool; } - void simpleAuthConnectTest(Hashtable env) { - InitialContext ctx = null; - long start = System.nanoTime(); - try { - ctx = new InitialDirContext(env); - // shouldn't reach here - System.err.println("Fail: InitialDirContext succeeded"); - fail(); - } catch (NamingException e) { - long end = System.nanoTime(); - if (e.getCause() instanceof SocketTimeoutException) { - if (NANOSECONDS.toMillis(end - start) < 2_900) { - pass(); - } else { - System.err.println("Fail: Waited too long"); - fail(); - } - } else if (e.getCause() instanceof InterruptedIOException) { - Thread.interrupted(); - fail(); - } else { - fail(); - } - } finally { - if (!shutItDown(ctx)) fail(); - } + public abstract void performOp(InitialContext ctx) throws NamingException; + public abstract void handleNamingException( + NamingException e, long start, long end); + + public void pass() { + this.passed = true; } - void deadServerNoTimeout(Hashtable env) { - InitialContext ctx = null; - long start = System.currentTimeMillis(); - try { - ctx = new InitialDirContext(env); - SearchControls scl = new SearchControls(); - scl.setSearchScope(SearchControls.SUBTREE_SCOPE); - NamingEnumeration answer = ((InitialDirContext)ctx) - .search("ou=People,o=JNDITutorial", "(objectClass=*)", scl); - // shouldn't reach here - fail(); - } catch (NamingException e) { - long elapsed = System.currentTimeMillis() - start; - if (elapsed < Connection.DEFAULT_READ_TIMEOUT_MILLIS) { - System.err.printf("fail: timeout should be at least %s ms, " + - "actual time is %s ms%n", - Connection.DEFAULT_READ_TIMEOUT_MILLIS, elapsed); - e.printStackTrace(); - fail(); - } else { - pass(); - } - } finally { - if (!shutItDown(ctx)) fail(); - } + public void fail() { + throw new RuntimeException("Test failed"); } boolean shutItDown(InitialContext ctx) { @@ -177,18 +92,376 @@ public class LdapTimeoutTest { } } - static class Server extends Thread { - final ServerSocket serverSock; + public Boolean call() { + InitialContext ctx = null; + ScheduledFuture killer = null; + long start = System.nanoTime(); - Server(ServerSocket serverSock) { - this.serverSock = serverSock; - } + try { + while(!server.accepting()) + Thread.sleep(200); // allow the server to start up + Thread.sleep(200); // to be sure + + // if this is a hanging test, scheduled a thread to + // interrupt after a certain time + if (killSwitchPool != null) { + final Thread current = Thread.currentThread(); + killer = killSwitchPool.schedule( + new Callable() { + public Void call() throws Exception { + current.interrupt(); + return null; + } + }, HANGING_TEST_TIMEOUT, MILLISECONDS); + } + + env.put(Context.PROVIDER_URL, "ldap://localhost:" + + server.getLocalPort()); - public void run() { try { - Socket socket = serverSock.accept(); - } catch (IOException e) {} + ctx = new InitialDirContext(env); + performOp(ctx); + fail(); + } catch (NamingException e) { + long end = System.nanoTime(); + System.out.println(this.getClass().toString() + " - elapsed: " + + NANOSECONDS.toMillis(end - start)); + handleNamingException(e, start, end); + } finally { + if (killer != null && !killer.isDone()) + killer.cancel(true); + shutItDown(ctx); + server.close(); + } + return passed; + } catch (IOException|InterruptedException e) { + throw new RuntimeException(e); } } } +abstract class ReadServerTest extends LdapTest { + + public ReadServerTest(Hashtable env) throws IOException { + super(new BindableServer(), env); + } + + public ReadServerTest(Hashtable env, + ScheduledExecutorService killSwitchPool) + throws IOException + { + super(new BindableServer(), env, killSwitchPool); + } + + public void performOp(InitialContext ctx) throws NamingException { + SearchControls scl = new SearchControls(); + scl.setSearchScope(SearchControls.SUBTREE_SCOPE); + NamingEnumeration answer = ((InitialDirContext)ctx) + .search("ou=People,o=JNDITutorial", "(objectClass=*)", scl); + } +} + +abstract class DeadServerTest extends LdapTest { + + public DeadServerTest(Hashtable env) throws IOException { + super(new DeadServer(), env); + } + + public DeadServerTest(Hashtable env, + ScheduledExecutorService killSwitchPool) + throws IOException + { + super(new DeadServer(), env, killSwitchPool); + } + + public void performOp(InitialContext ctx) throws NamingException {} +} + +class DeadServerNoTimeoutTest extends DeadServerTest { + + public DeadServerNoTimeoutTest(Hashtable env, + ScheduledExecutorService killSwitchPool) + throws IOException + { + super(env, killSwitchPool); + } + + public void handleNamingException(NamingException e, long start, long end) { + if (e instanceof InterruptedNamingException) Thread.interrupted(); + + if (NANOSECONDS.toMillis(end - start) < LdapTimeoutTest.MIN_TIMEOUT) { + System.err.printf("DeadServerNoTimeoutTest fail: timeout should be " + + "at least %s ms, actual time is %s ms%n", + LdapTimeoutTest.MIN_TIMEOUT, + NANOSECONDS.toMillis(end - start)); + fail(); + } else { + pass(); + } + } +} + +class DeadServerTimeoutTest extends DeadServerTest { + + public DeadServerTimeoutTest(Hashtable env) throws IOException { + super(env); + } + + public void handleNamingException(NamingException e, long start, long end) + { + // non SSL connect will timeout via readReply using connectTimeout + if (NANOSECONDS.toMillis(end - start) < 2_900) { + pass(); + } else { + System.err.println("Fail: Waited too long"); + fail(); + } + } +} + +class DeadServerTimeoutSSLTest extends DeadServerTest { + + public DeadServerTimeoutSSLTest(Hashtable env) throws IOException { + super(env); + } + + public void handleNamingException(NamingException e, long start, long end) { + if (e.getCause() instanceof SocketTimeoutException) { + // SSL connect will timeout via readReply using + // SocketTimeoutException + pass(); + } else { + fail(); + } + } +} + + +class ReadServerNoTimeoutTest extends ReadServerTest { + + public ReadServerNoTimeoutTest(Hashtable env, + ScheduledExecutorService killSwitchPool) + throws IOException + { + super(env, killSwitchPool); + } + + public void handleNamingException(NamingException e, long start, long end) { + if (e instanceof InterruptedNamingException) Thread.interrupted(); + + if (NANOSECONDS.toMillis(end - start) < LdapTimeoutTest.MIN_TIMEOUT) { + System.err.printf("ReadServerNoTimeoutTest fail: timeout should be " + + "at least %s ms, actual time is %s ms%n", + LdapTimeoutTest.MIN_TIMEOUT, + NANOSECONDS.toMillis(end - start)); + fail(); + } else { + pass(); + } + } +} + +class ReadServerTimeoutTest extends ReadServerTest { + + public ReadServerTimeoutTest(Hashtable env) throws IOException { + super(env); + } + + public void handleNamingException(NamingException e, long start, long end) { + if (NANOSECONDS.toMillis(end - start) < 2_900) { + fail(); + } else { + pass(); + } + } +} + +class TestServer extends Thread { + ServerSocket serverSock; + boolean accepting = false; + + public TestServer() throws IOException { + this.serverSock = new ServerSocket(0); + start(); + } + + public int getLocalPort() { + return serverSock.getLocalPort(); + } + + public boolean accepting() { + return accepting; + } + + public void close() throws IOException { + serverSock.close(); + } +} + +class BindableServer extends TestServer { + + public BindableServer() throws IOException { + super(); + } + + private byte[] bindResponse = { + 0x30, 0x0C, 0x02, 0x01, 0x01, 0x61, 0x07, 0x0A, + 0x01, 0x00, 0x04, 0x00, 0x04, 0x00 + }; + + public void run() { + try { + accepting = true; + Socket socket = serverSock.accept(); + InputStream in = socket.getInputStream(); + OutputStream out = socket.getOutputStream(); + + // Read the LDAP BindRequest + while (in.read() != -1) { + in.skip(in.available()); + break; + } + + // Write an LDAP BindResponse + out.write(bindResponse); + out.flush(); + } catch (IOException e) { + // ignore + } + } +} + +class DeadServer extends TestServer { + + public DeadServer() throws IOException { + super(); + } + + public void run() { + while(true) { + try { + accepting = true; + Socket socket = serverSock.accept(); + } catch (Exception e) { + break; + } + } + } +} + +public class LdapTimeoutTest { + + private static final ExecutorService testPool = + Executors.newFixedThreadPool(3); + private static final ScheduledExecutorService killSwitchPool = + Executors.newScheduledThreadPool(3); + public static int MIN_TIMEOUT = 18_000; + + static Hashtable createEnv() { + Hashtable env = new Hashtable(11); + env.put(Context.INITIAL_CONTEXT_FACTORY, + "com.sun.jndi.ldap.LdapCtxFactory"); + return env; + } + + public static void main(String[] args) throws Exception { + + InitialContext ctx = null; + List results = new ArrayList<>(); + + try { + // run the DeadServerTest with no timeouts set + // this should get stuck indefinitely, so we need to kill + // it after a timeout + System.out.println("Running connect timeout test with 20s kill switch"); + Hashtable env = createEnv(); + results.add( + testPool.submit(new DeadServerNoTimeoutTest(env, killSwitchPool))); + + // run the ReadServerTest with connect timeout set + // this should get stuck indefinitely so we need to kill + // it after a timeout + System.out.println("Running read timeout test with 10ms connect timeout & 20s kill switch"); + Hashtable env1 = createEnv(); + env1.put("com.sun.jndi.ldap.connect.timeout", "10"); + results.add(testPool.submit( + new ReadServerNoTimeoutTest(env1, killSwitchPool))); + + // run the ReadServerTest with no timeouts set + // this should get stuck indefinitely, so we need to kill + // it after a timeout + System.out.println("Running read timeout test with 20s kill switch"); + Hashtable env2 = createEnv(); + results.add(testPool.submit( + new ReadServerNoTimeoutTest(env2, killSwitchPool))); + + // run the DeadServerTest with connect / read timeouts set + // this should exit after the connect timeout expires + System.out.println("Running connect timeout test with 10ms connect timeout, 3000ms read timeout"); + Hashtable env3 = createEnv(); + env3.put("com.sun.jndi.ldap.connect.timeout", "10"); + env3.put("com.sun.jndi.ldap.read.timeout", "3000"); + results.add(testPool.submit(new DeadServerTimeoutTest(env3))); + + + // run the ReadServerTest with connect / read timeouts set + // this should exit after the connect timeout expires + System.out.println("Running read timeout test with 10ms connect timeout, 3000ms read timeout"); + Hashtable env4 = createEnv(); + env4.put("com.sun.jndi.ldap.connect.timeout", "10"); + env4.put("com.sun.jndi.ldap.read.timeout", "3000"); + results.add(testPool.submit(new ReadServerTimeoutTest(env4))); + + // run the DeadServerTest with connect timeout set + // this should exit after the connect timeout expires + System.out.println("Running connect timeout test with 10ms connect timeout"); + Hashtable env5 = createEnv(); + env5.put("com.sun.jndi.ldap.connect.timeout", "10"); + results.add(testPool.submit(new DeadServerTimeoutTest(env5))); + + // 8000487: Java JNDI connection library on ldap conn is + // not honoring configured timeout + System.out.println("Running simple auth connection test"); + Hashtable env6 = createEnv(); + env6.put("com.sun.jndi.ldap.connect.timeout", "10"); + env6.put("com.sun.jndi.ldap.read.timeout", "3000"); + env6.put(Context.SECURITY_AUTHENTICATION, "simple"); + env6.put(Context.SECURITY_PRINCIPAL, "user"); + env6.put(Context.SECURITY_CREDENTIALS, "password"); + results.add(testPool.submit(new DeadServerTimeoutTest(env6))); + + boolean testFailed = false; + for (Future test : results) { + while (!test.isDone()) { + if ((Boolean) test.get() == false) + testFailed = true; + } + } + + // + // Running this test serially as it seems to tickle a problem + // on older kernels + // + // run the DeadServerTest with connect / read timeouts set + // and ssl enabled + // this should exit with a SocketTimeoutException as the root cause + // it should also use the connect timeout instead of the read timeout + System.out.println("Running connect timeout test with 10ms connect timeout, 3000ms read timeout & SSL"); + Hashtable sslenv = createEnv(); + sslenv.put("com.sun.jndi.ldap.connect.timeout", "10"); + sslenv.put("com.sun.jndi.ldap.read.timeout", "3000"); + sslenv.put(Context.SECURITY_PROTOCOL, "ssl"); + testFailed = (new DeadServerTimeoutSSLTest(sslenv).call()) ? false : true; + + if (testFailed) { + throw new AssertionError("some tests failed"); + } + + } finally { + LdapTimeoutTest.killSwitchPool.shutdown(); + LdapTimeoutTest.testPool.shutdown(); + } + } + +} + diff --git a/jdk/test/java/lang/invoke/ExplicitCastArgumentsTest.java b/jdk/test/java/lang/invoke/ExplicitCastArgumentsTest.java index 06f7a64aabd..045ec15599e 100644 --- a/jdk/test/java/lang/invoke/ExplicitCastArgumentsTest.java +++ b/jdk/test/java/lang/invoke/ExplicitCastArgumentsTest.java @@ -32,21 +32,36 @@ import sun.invoke.util.Wrapper; */ public class ExplicitCastArgumentsTest { private static final boolean VERBOSE = Boolean.getBoolean("verbose"); + private static final Class THIS_CLASS = ExplicitCastArgumentsTest.class; public static void main(String[] args) throws Throwable { + testVarargsCollector(); + testRef2Prim(); + System.out.println("TEST PASSED"); + } + + public static String[] f(String... args) { return args; } + + public static void testVarargsCollector() throws Throwable { + MethodType mt = MethodType.methodType(String[].class, String[].class); + MethodHandle mh = MethodHandles.publicLookup().findStatic(THIS_CLASS, "f", mt); + mh = MethodHandles.explicitCastArguments(mh, MethodType.methodType(Object.class, Object.class)); + mh.invokeWithArguments((Object)(new String[] {"str1", "str2"})); + } + + public static void testRef2Prim() throws Throwable { for (Wrapper from : Wrapper.values()) { for (Wrapper to : Wrapper.values()) { if (from == Wrapper.VOID || to == Wrapper.VOID) continue; - testRef2Prim (from, to); + testRef2Prim(from, to); } } - System.out.println("TEST PASSED"); } public static void testRef2Prim(Wrapper from, Wrapper to) throws Throwable { // MHs.eCA javadoc: // If T0 is a reference and T1 a primitive, and if the reference is null at runtime, a zero value is introduced. - test(from.wrapperType(), to.primitiveType(), null, false); + test(from.wrapperType(), to.primitiveType(), null, false); } public static void test(Class from, Class to, Object param, boolean failureExpected) throws Throwable { diff --git a/jdk/test/java/lang/invoke/LFCaching/LFGarbageCollectedTest.java b/jdk/test/java/lang/invoke/LFCaching/LFGarbageCollectedTest.java index f0f6b034dbb..89a1ecf8e91 100644 --- a/jdk/test/java/lang/invoke/LFCaching/LFGarbageCollectedTest.java +++ b/jdk/test/java/lang/invoke/LFCaching/LFGarbageCollectedTest.java @@ -26,7 +26,6 @@ * @bug 8046703 * @summary Test verifies that lambda forms are garbage collected * @author kshefov - * @ignore 8057020 * @library /lib/testlibrary/jsr292 /lib/testlibrary * @build TestMethods * @build LambdaFormTestCase diff --git a/jdk/test/java/lang/invoke/LFCaching/LambdaFormTestCase.java b/jdk/test/java/lang/invoke/LFCaching/LambdaFormTestCase.java index 94722cf72df..9fcc45eae3f 100644 --- a/jdk/test/java/lang/invoke/LFCaching/LambdaFormTestCase.java +++ b/jdk/test/java/lang/invoke/LFCaching/LambdaFormTestCase.java @@ -31,6 +31,7 @@ import java.util.Collection; import java.util.List; import java.util.function.Function; import jdk.testlibrary.Utils; +import jdk.testlibrary.TimeLimitedRunner; /** * Lambda forms caching test case class. Contains all necessary test routines to @@ -45,7 +46,7 @@ public abstract class LambdaFormTestCase { private final static String INTERNAL_FORM_METHOD_NAME = "internalForm"; private static final double ITERATIONS_TO_CODE_CACHE_SIZE_RATIO = 45 / (128.0 * 1024 * 1024); - private static final long TIMEOUT = Utils.adjustTimeout(Utils.DEFAULT_TEST_TIMEOUT); + private static final long TIMEOUT = Helper.IS_THOROUGH ? 0L : (long) (Utils.adjustTimeout(Utils.DEFAULT_TEST_TIMEOUT) * 0.9); /** * Reflection link to {@code j.l.i.MethodHandle.internalForm} method. It is @@ -68,13 +69,98 @@ public abstract class LambdaFormTestCase { } gcInfo = ManagementFactory.getGarbageCollectorMXBeans(); - if (gcInfo.size() == 0) { + if (gcInfo.size() == 0) { throw new Error("No GarbageCollectorMXBeans found."); } } private final TestMethods testMethod; private long gcCountAtStart; + + private static class TestRun { + + final Function ctor; + final Collection testMethods; + final long totalIterations; + long doneIterations; + long testCounter; + long failCounter; + boolean passed; + + TestRun(Function ctor, Collection testMethods) { + this.ctor = ctor; + this.testMethods = testMethods; + long testCaseNum = testMethods.size(); + long iterations = Math.max(1, Helper.TEST_LIMIT / testCaseNum); + System.out.printf("Number of iterations according to -DtestLimit is %d (%d cases)%n", + iterations, iterations * testCaseNum); + HotSpotDiagnosticMXBean hsDiagBean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class); + long codeCacheSize = Long.parseLong( + hsDiagBean.getVMOption("ReservedCodeCacheSize").getValue()); + System.out.printf("Code cache size is %d bytes%n", codeCacheSize); + long iterationsByCodeCacheSize = (long) (codeCacheSize + * ITERATIONS_TO_CODE_CACHE_SIZE_RATIO); + long nonProfiledCodeCacheSize = Long.parseLong( + hsDiagBean.getVMOption("NonProfiledCodeHeapSize").getValue()); + System.out.printf("Non-profiled code cache size is %d bytes%n", nonProfiledCodeCacheSize); + long iterationsByNonProfiledCodeCacheSize = (long) (nonProfiledCodeCacheSize + * ITERATIONS_TO_CODE_CACHE_SIZE_RATIO); + System.out.printf("Number of iterations limited by code cache size is %d (%d cases)%n", + iterationsByCodeCacheSize, iterationsByCodeCacheSize * testCaseNum); + System.out.printf("Number of iterations limited by non-profiled code cache size is %d (%d cases)%n", + iterationsByNonProfiledCodeCacheSize, iterationsByNonProfiledCodeCacheSize * testCaseNum); + iterations = Math.min(iterationsByCodeCacheSize, + Math.min(iterations, iterationsByNonProfiledCodeCacheSize)); + if (iterations == 0) { + System.out.println("Warning: code cache size is too small to provide at" + + " least one iteration! Test will try to do one iteration."); + iterations = 1; + } + System.out.printf("Number of iterations is set to %d (%d cases)%n", + iterations, iterations * testCaseNum); + System.out.flush(); + totalIterations = iterations; + doneIterations = 0L; + testCounter = 0L; + failCounter = 0L; + passed = true; + } + + Boolean doIteration() { + if (doneIterations >= totalIterations) { + return false; + } + System.err.println(String.format("Iteration %d:", doneIterations)); + for (TestMethods testMethod : testMethods) { + LambdaFormTestCase testCase = ctor.apply(testMethod); + try { + System.err.printf("Tested LF caching feature with MethodHandles.%s method.%n", + testCase.getTestMethod().name); + testCase.doTest(); + System.err.println("PASSED"); + } catch (Throwable t) { + t.printStackTrace(); + System.err.printf("FAILED. Caused by %s%n", t.getMessage()); + passed = false; + failCounter++; + } + testCounter++; + } + doneIterations++; + return true; + } + + void checkPassed() { + if (!passed) { + throw new Error(String.format("%d of %d test cases FAILED! %n" + + "Rerun the test with the same \"-Dseed=\" option as in the log file!", + failCounter, testCounter)); + } else { + System.err.printf("All %d test cases PASSED!%n", testCounter); + } + } + } + /** * Test case constructor. Generates test cases with random method types for * given methods form {@code j.l.i.MethodHandles} class. @@ -108,71 +194,15 @@ public abstract class LambdaFormTestCase { * @param testMethods list of test methods */ public static void runTests(Function ctor, Collection testMethods) { - boolean passed = true; - int testCounter = 0; - int failCounter = 0; - long testCaseNum = testMethods.size(); - long iterations = Math.max(1, Helper.TEST_LIMIT / testCaseNum); - System.out.printf("Number of iterations according to -DtestLimit is %d (%d cases)%n", - iterations, iterations * testCaseNum); - HotSpotDiagnosticMXBean hsDiagBean = ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class); - long codeCacheSize = Long.parseLong( - hsDiagBean.getVMOption("ReservedCodeCacheSize").getValue()); - System.out.printf("Code cache size is %d bytes%n", codeCacheSize); - long iterationsByCodeCacheSize = (long) (codeCacheSize - * ITERATIONS_TO_CODE_CACHE_SIZE_RATIO); - long nonProfiledCodeCacheSize = Long.parseLong( - hsDiagBean.getVMOption("NonProfiledCodeHeapSize").getValue()); - System.out.printf("Non-profiled code cache size is %d bytes%n", nonProfiledCodeCacheSize); - long iterationsByNonProfiledCodeCacheSize = (long) (nonProfiledCodeCacheSize - * ITERATIONS_TO_CODE_CACHE_SIZE_RATIO); - System.out.printf("Number of iterations limited by code cache size is %d (%d cases)%n", - iterationsByCodeCacheSize, iterationsByCodeCacheSize * testCaseNum); - System.out.printf("Number of iterations limited by non-profiled code cache size is %d (%d cases)%n", - iterationsByNonProfiledCodeCacheSize, iterationsByNonProfiledCodeCacheSize * testCaseNum); - iterations = Math.min(iterationsByCodeCacheSize, - Math.min(iterations, iterationsByNonProfiledCodeCacheSize)); - if (iterations == 0) { - System.out.println("Warning: code cache size is too small to provide at" - + " least one iteration! Test will try to do one iteration."); - iterations = 1; - } - System.out.printf("Number of iterations is set to %d (%d cases)%n", - iterations, iterations * testCaseNum); - System.out.flush(); - long startTime = System.currentTimeMillis(); - for (long i = 0; i < iterations; i++) { - System.err.println(String.format("Iteration %d:", i)); - for (TestMethods testMethod : testMethods) { - LambdaFormTestCase testCase = ctor.apply(testMethod); - try { - System.err.printf("Tested LF caching feature with MethodHandles.%s method.%n", - testCase.getTestMethod().name); - testCase.doTest(); - System.err.println("PASSED"); - } catch (Throwable t) { - t.printStackTrace(); - System.err.println("FAILED"); - passed = false; - failCounter++; - } - testCounter++; - } - long passedTime = System.currentTimeMillis() - startTime; - long avgIterTime = passedTime / (i + 1); - long remainTime = TIMEOUT - passedTime; - if (avgIterTime > 2 * remainTime) { - System.err.printf("Stopping iterations because of lack of time.%n" - + "Increase timeout factor for more iterations.%n"); - break; - } - } - if (!passed) { - throw new Error(String.format("%d of %d test cases FAILED! %n" - + "Rerun the test with the same \"-Dseed=\" option as in the log file!", - failCounter, testCounter)); - } else { - System.err.println(String.format("All %d test cases PASSED!", testCounter)); + LambdaFormTestCase.TestRun run = + new LambdaFormTestCase.TestRun(ctor, testMethods); + TimeLimitedRunner runner = new TimeLimitedRunner(TIMEOUT, 4.0d, run::doIteration); + try { + runner.call(); + } catch (Exception ex) { + System.err.println("FAILED"); + throw new Error("Unexpected error!", ex); } + run.checkPassed(); } } diff --git a/jdk/test/java/nio/channels/FileChannel/TransferToChannel.java b/jdk/test/java/nio/channels/FileChannel/TransferToChannel.java index 05069d296dc..2aa1b4bd2cc 100644 --- a/jdk/test/java/nio/channels/FileChannel/TransferToChannel.java +++ b/jdk/test/java/nio/channels/FileChannel/TransferToChannel.java @@ -24,6 +24,8 @@ /* @test * @bug 4652496 * @summary Test transferTo with different target channels + * @run main TransferToChannel + * @run main/othervm -Djdk.net.enableFastFileTransfer TransferToChannel */ import java.nio.channels.FileChannel; diff --git a/jdk/test/java/nio/file/Files/SBC.java b/jdk/test/java/nio/file/Files/SBC.java index d26428d5f60..64672d27947 100644 --- a/jdk/test/java/nio/file/Files/SBC.java +++ b/jdk/test/java/nio/file/Files/SBC.java @@ -22,7 +22,7 @@ */ /* @test - * @bug 4313887 + * @bug 4313887 8066915 * @summary Unit test for java.nio.file.Files.newByteChannel * @library .. */ @@ -59,6 +59,7 @@ public class SBC { dosSharingOptionTests(dir); // misc. tests + directoryOpenTests(dir); badCombinations(dir); unsupportedOptions(dir); nullTests(dir); @@ -278,6 +279,21 @@ public class SBC { } } + // test opening a directory for read or write + static void directoryOpenTests(Path dir) throws Exception { + try (SeekableByteChannel sbc = Files.newByteChannel(dir, READ)) { + throw new RuntimeException("Opened directory for read"); + } catch (IOException expected) { } + + try (SeekableByteChannel sbc = Files.newByteChannel(dir, WRITE)) { + throw new RuntimeException("Opened directory for write"); + } catch (IOException expected) { } + + try (SeekableByteChannel sbc = Files.newByteChannel(dir, APPEND)) { + throw new RuntimeException("Opened directory for append "); + } catch (IOException expected) { } + } + // Windows specific options for the use by applications that really want // to use legacy DOS sharing options static void dosSharingOptionTests(Path dir) throws Exception { diff --git a/jdk/test/java/rmi/testlibrary/JavaVM.java b/jdk/test/java/rmi/testlibrary/JavaVM.java index b7137a82872..b304cd25213 100644 --- a/jdk/test/java/rmi/testlibrary/JavaVM.java +++ b/jdk/test/java/rmi/testlibrary/JavaVM.java @@ -34,6 +34,8 @@ import java.util.concurrent.TimeoutException; */ public class JavaVM { + public static final long POLLTIME_MS = 100L; + protected Process vm = null; private String classname = ""; @@ -192,23 +194,21 @@ public class JavaVM { throws InterruptedException, TimeoutException { if (vm == null) throw new IllegalStateException("can't wait for JavaVM that isn't running"); - long startTime = System.currentTimeMillis(); - long rem = timeout; + long deadline = computeDeadline(System.currentTimeMillis(), timeout); - do { + while (true) { try { int status = vm.exitValue(); outPipe.join(); errPipe.join(); return status; - } catch (IllegalThreadStateException ex) { - if (rem > 0) { - Thread.sleep(Math.min(rem, 100)); - } - } - rem = timeout - (System.currentTimeMillis() - startTime); - } while (rem > 0); - throw new TimeoutException(); + } catch (IllegalThreadStateException ignore) { } + + if (System.currentTimeMillis() > deadline) + throw new TimeoutException(); + + Thread.sleep(POLLTIME_MS); + } } /** @@ -218,4 +218,21 @@ public class JavaVM { start(); return waitFor(); } + + /** + * Computes a deadline from a timestamp and a timeout value. + * Maximum timeout (before multipliers are applied) is one hour. + */ + public static long computeDeadline(long timestamp, long timeout) { + final long MAX_TIMEOUT_MS = 3_600_000L; + + if (timeout < 0L || timeout > MAX_TIMEOUT_MS) { + throw new IllegalArgumentException("timeout " + timeout + "ms out of range"); + } + + // TODO apply test.timeout.factor (and possibly jcov.sleep.multiplier) + // here instead of upstream + + return timestamp + timeout; + } } diff --git a/jdk/test/java/rmi/testlibrary/RMID.java b/jdk/test/java/rmi/testlibrary/RMID.java index 29365e8125f..48fb49aa4d2 100644 --- a/jdk/test/java/rmi/testlibrary/RMID.java +++ b/jdk/test/java/rmi/testlibrary/RMID.java @@ -256,19 +256,28 @@ public class RMID extends JavaVM { } catch (NumberFormatException ignore) {} waitTime = waitTime * slopFactor; - // We check several times, for a maximum of waitTime, until we have - // verified that rmid is running. - do { + long startTime = System.currentTimeMillis(); + long deadline = computeDeadline(startTime, waitTime); + + while (true) { try { - Thread.sleep(Math.min(waitTime, POLLTIME_MS)); + Thread.sleep(POLLTIME_MS); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); - mesg("Interrupted while starting activation system, giving up."); + mesg("Starting rmid interrupted, giving up at " + + (System.currentTimeMillis() - startTime) + "ms."); return; } - waitTime -= POLLTIME_MS; - // Checking if rmid is present + try { + int status = vm.exitValue(); + TestLibrary.bomb("Rmid process exited with status " + status + " after " + + (System.currentTimeMillis() - startTime) + "ms."); + } catch (IllegalThreadStateException ignore) { } + + // The rmid process is alive; check to see whether + // it responds to a remote call. + if (lookupSystem(port) != null) { /* * We need to set the java.rmi.activation.port value as the @@ -278,15 +287,16 @@ public class RMID extends JavaVM { * incorrect value. */ System.setProperty("java.rmi.activation.port", Integer.toString(port)); - mesg("Started successfully."); + mesg("Started successfully after " + + (System.currentTimeMillis() - startTime) + "ms."); return; - } else { - if (waitTime > 0) { - mesg("rmid not started, will retry for " + waitTime + "ms"); - } } - } while (waitTime > 0); - TestLibrary.bomb("Failed to start rmid, giving up.", null); + + if (System.currentTimeMillis() > deadline) { + TestLibrary.bomb("Failed to start rmid, giving up after " + + (System.currentTimeMillis() - startTime) + "ms.", null); + } + } } /** @@ -309,9 +319,11 @@ public class RMID extends JavaVM { */ private boolean shutdown() throws InterruptedException { mesg("shutdown()"); + long startTime = System.currentTimeMillis(); ActivationSystem system = lookupSystem(port); if (system == null) { - mesg("lookupSystem() returned null"); + mesg("lookupSystem() returned null after " + + (System.currentTimeMillis() - startTime) + "ms."); return false; } @@ -325,10 +337,12 @@ public class RMID extends JavaVM { try { waitFor(TIMEOUT_SHUTDOWN_MS); - mesg("Shutdown successful."); + mesg("Shutdown successful after " + + (System.currentTimeMillis() - startTime) + "ms."); return true; } catch (TimeoutException ex) { - mesg("Shutdown timed out:"); + mesg("Shutdown timed out after " + + (System.currentTimeMillis() - startTime) + "ms:"); ex.printStackTrace(); return false; } @@ -344,6 +358,8 @@ public class RMID extends JavaVM { throw new IllegalStateException("can't wait for RMID that isn't running"); } + long startTime = System.currentTimeMillis(); + // First, attempt graceful shutdown of the activation system. try { if (! shutdown()) { @@ -352,14 +368,17 @@ public class RMID extends JavaVM { vm.destroy(); try { waitFor(TIMEOUT_DESTROY_MS); - mesg("Destroy successful."); + mesg("Destroy successful after " + + (System.currentTimeMillis() - startTime) + "ms."); } catch (TimeoutException ex) { - mesg("Destroy timed out, giving up."); + mesg("Destroy timed out, giving up after " + + (System.currentTimeMillis() - startTime) + "ms:"); ex.printStackTrace(); } } } catch (InterruptedException ie) { - mesg("Shutdown/destroy interrupted, giving up."); + mesg("Shutdown/destroy interrupted, giving up at " + + (System.currentTimeMillis() - startTime) + "ms."); ie.printStackTrace(); Thread.currentThread().interrupt(); return; diff --git a/jdk/test/java/util/logging/LogManagerAppContextDeadlock.java b/jdk/test/java/util/logging/LogManagerAppContextDeadlock.java new file mode 100644 index 00000000000..3e4918e5fee --- /dev/null +++ b/jdk/test/java/util/logging/LogManagerAppContextDeadlock.java @@ -0,0 +1,370 @@ +/* + * 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.management.ManagementFactory; +import java.lang.management.ThreadInfo; +import java.security.CodeSource; +import java.security.Permission; +import java.security.PermissionCollection; +import java.security.Permissions; +import java.security.Policy; +import java.security.ProtectionDomain; +import java.util.Enumeration; +import java.util.concurrent.Semaphore; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.logging.LogManager; +import java.util.logging.Logger; + +/** + * @test + * @bug 8065991 + * @summary check that when LogManager is initialized, a deadlock similar + * to that described in 8065709 will not occur. + * @run main/othervm LogManagerAppContextDeadlock UNSECURE + * @run main/othervm LogManagerAppContextDeadlock SECURE + * + * @author danielfuchs + */ +public class LogManagerAppContextDeadlock { + + public static final Semaphore sem = new Semaphore(0); + public static final Semaphore sem2 = new Semaphore(0); + public static final Semaphore sem3 = new Semaphore(-2); + public static volatile boolean goOn = true; + public static volatile Exception thrown; + + // Emulate EventQueue + static class FakeEventQueue { + static final Logger logger = Logger.getLogger("foo"); + } + + // Emulate AppContext + static class FakeAppContext { + + final static AtomicInteger numAppContexts = new AtomicInteger(0); + static final class FakeAppContextLock {} + static final FakeAppContextLock lock = new FakeAppContextLock(); + static volatile FakeAppContext appContext; + + final FakeEventQueue queue; + FakeAppContext() { + appContext = this; + numAppContexts.incrementAndGet(); + // release sem2 to let Thread t2 call Logger.getLogger(). + sem2.release(); + try { + // Wait until we JavaAWTAccess is called by LogManager. + // Thread 2 will call Logger.getLogger() which will + // trigger a call to JavaAWTAccess - which will release + // sem, thus ensuring that Thread #2 is where we want it. + sem.acquire(); + System.out.println("Sem acquired: Thread #2 has called JavaAWTAccess"); + } catch(InterruptedException x) { + Thread.interrupted(); + } + queue = new FakeEventQueue(); + } + + static FakeAppContext getAppContext() { + synchronized (lock) { + if (numAppContexts.get() == 0) { + return new FakeAppContext(); + } + return appContext; + } + } + + static { + sun.misc.SharedSecrets.setJavaAWTAccess(new sun.misc.JavaAWTAccess() { + @Override + public Object getAppletContext() { + if (numAppContexts.get() == 0) return null; + // We are in JavaAWTAccess, we can release sem and let + // FakeAppContext constructor proceeed. + System.out.println("Releasing Sem"); + sem.release(); + return getAppContext(); + } + + }); + } + + } + + + // Test with or without a security manager + public static enum TestCase { + UNSECURE, SECURE; + public void run() throws Exception { + System.out.println("Running test case: " + name()); + Configure.setUp(this); + test(this); + } + } + + public static void test(TestCase test) throws Exception { + Thread t1 = new Thread() { + @Override + public void run() { + sem3.release(); + System.out.println("FakeAppContext.getAppContext()"); + FakeAppContext.getAppContext(); + System.out.println("Done: FakeAppContext.getAppContext()"); + } + }; + t1.setDaemon(true); + t1.start(); + Thread t2 = new Thread() { + public void run() { + sem3.release(); + try { + // Wait until Thread1 is in FakeAppContext constructor + sem2.acquire(); + System.out.println("Sem2 acquired: Thread #1 will be waiting to acquire Sem"); + } catch (InterruptedException ie) { + Thread.interrupted(); + } + System.out.println("Logger.getLogger(name).info(name)"); + Logger.getLogger(test.name());//.info(name); + System.out.println("Done: Logger.getLogger(name).info(name)"); + } + }; + t2.setDaemon(true); + t2.start(); + System.out.println("Should exit now..."); + Thread detector = new DeadlockDetector(); + detector.start(); + + // Wait for the 3 threads to start + sem3.acquire(); + + // Now wait for t1 & t2 to finish, or for a deadlock to be detected. + while (goOn && (t1.isAlive() || t2.isAlive())) { + if (t2.isAlive()) t2.join(1000); + if (test == TestCase.UNSECURE && System.getSecurityManager() == null) { + // if there's no security manager, AppContext.getAppContext() is + // not called - so Thread t2 will not end up calling + // sem.release(). In that case we must release the semaphore here + // so that t1 can proceed. + if (LogManager.getLogManager().getLogger(TestCase.UNSECURE.name()) != null) { + // means Thread t2 has created the logger + sem.release(); + } + } + if (t1.isAlive()) t1.join(1000); + } + if (thrown != null) { + throw thrown; + } + } + + // Thrown by the deadlock detector + static final class DeadlockException extends RuntimeException { + public DeadlockException(String message) { + super(message); + } + @Override + public void printStackTrace() { + } + } + + public static void main(String[] args) throws Exception { + + if (args.length == 0) { + args = new String[] { "SECURE" }; + } + + // If we don't initialize LogManager here, there will be + // a deadlock. + // See + // for more details. + Logger.getLogger("main").info("starting..."); + try { + TestCase.valueOf(args[0]).run(); + System.out.println("Test "+args[0]+" Passed"); + } catch(Throwable t) { + System.err.println("Test " + args[0] +" failed: " + t); + t.printStackTrace(); + } + } + + // Called by the deadlock detector when a deadlock is found. + static void fail(Exception x) { + x.printStackTrace(); + if (thrown == null) { + thrown = x; + } + goOn = false; + } + + // A thread that detect deadlocks. + final static class DeadlockDetector extends Thread { + + public DeadlockDetector() { + this.setDaemon(true); + } + + @Override + public void run() { + sem3.release(); + Configure.doPrivileged(this::loop); + } + public void loop() { + while(goOn) { + try { + long[] ids = ManagementFactory.getThreadMXBean().findDeadlockedThreads(); + ids = ids == null ? new long[0] : 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); + } + throw new DeadlockException("Found "+ids.length+" deadlocked threads"); + } + Thread.sleep(100); + } catch(InterruptedException | RuntimeException x) { + fail(x); + } + } + } + + } + + // A helper class to configure the security manager for the test, + // and bypass it when needed. + static class Configure { + static Policy policy = null; + static final ThreadLocal allowAll = new ThreadLocal() { + @Override + protected AtomicBoolean initialValue() { + return new AtomicBoolean(false); + } + }; + static void setUp(TestCase test) { + switch (test) { + case SECURE: + if (policy == null && System.getSecurityManager() != null) { + throw new IllegalStateException("SecurityManager already set"); + } else if (policy == null) { + policy = new SimplePolicy(TestCase.SECURE, allowAll); + Policy.setPolicy(policy); + System.setSecurityManager(new SecurityManager()); + } + if (System.getSecurityManager() == null) { + throw new IllegalStateException("No SecurityManager."); + } + if (policy == null) { + throw new IllegalStateException("policy not configured"); + } + break; + case UNSECURE: + if (System.getSecurityManager() != null) { + throw new IllegalStateException("SecurityManager already set"); + } + break; + default: + new InternalError("No such testcase: " + test); + } + } + static void doPrivileged(Runnable run) { + allowAll.get().set(true); + try { + run.run(); + } finally { + allowAll.get().set(false); + } + } + } + + // A Helper class to build a set of permissions. + final static class PermissionsBuilder { + final Permissions perms; + public PermissionsBuilder() { + this(new Permissions()); + } + public PermissionsBuilder(Permissions perms) { + this.perms = perms; + } + public PermissionsBuilder add(Permission p) { + perms.add(p); + return this; + } + public PermissionsBuilder addAll(PermissionCollection col) { + if (col != null) { + for (Enumeration e = col.elements(); e.hasMoreElements(); ) { + perms.add(e.nextElement()); + } + } + return this; + } + public Permissions toPermissions() { + final PermissionsBuilder builder = new PermissionsBuilder(); + builder.addAll(perms); + return builder.perms; + } + } + + // Policy for the test... + public static class SimplePolicy extends Policy { + + final Permissions permissions; + final Permissions allPermissions; + final ThreadLocal allowAll; // actually: this should be in a thread locale + public SimplePolicy(TestCase test, ThreadLocal allowAll) { + this.allowAll = allowAll; + // we don't actually need any permission to create our + // FileHandlers because we're passing invalid parameters + // which will make the creation fail... + permissions = new Permissions(); + permissions.add(new RuntimePermission("accessClassInPackage.sun.misc")); + + // these are used for configuring the test itself... + allPermissions = new Permissions(); + allPermissions.add(new java.security.AllPermission()); + + } + + @Override + public boolean implies(ProtectionDomain domain, Permission permission) { + if (allowAll.get().get()) return allPermissions.implies(permission); + return permissions.implies(permission); + } + + @Override + public PermissionCollection getPermissions(CodeSource codesource) { + return new PermissionsBuilder().addAll(allowAll.get().get() + ? allPermissions : permissions).toPermissions(); + } + + @Override + public PermissionCollection getPermissions(ProtectionDomain domain) { + return new PermissionsBuilder().addAll(allowAll.get().get() + ? allPermissions : permissions).toPermissions(); + } + } + +} diff --git a/jdk/test/javax/management/remote/mandatory/connection/RMIConnector_NPETest.java b/jdk/test/javax/management/remote/mandatory/connection/RMIConnector_NPETest.java index c672296c11d..54af752e5c3 100644 --- a/jdk/test/javax/management/remote/mandatory/connection/RMIConnector_NPETest.java +++ b/jdk/test/javax/management/remote/mandatory/connection/RMIConnector_NPETest.java @@ -38,7 +38,7 @@ import javax.management.remote.rmi.*; public class RMIConnector_NPETest { public static void main(String argv[]) throws Exception { RMID rmid = RMID.createRMID(); - rmid.start(Long.MAX_VALUE); + rmid.start(); int rmidPort = rmid.getPort(); Exception failureCause = null; RMIConnector agent = null; diff --git a/jdk/test/javax/net/ssl/TLS/TLSClientPropertyTest.java b/jdk/test/javax/net/ssl/TLS/TLSClientPropertyTest.java new file mode 100644 index 00000000000..e3398ae6ee5 --- /dev/null +++ b/jdk/test/javax/net/ssl/TLS/TLSClientPropertyTest.java @@ -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. + */ + +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; +import java.util.List; +import javax.net.ssl.SSLContext; + +/* + * @test + * @bug 8049432 + * @summary New tests for TLS property jdk.tls.client.protocols + * @run main/othervm TLSClientPropertyTest NoProperty + * @run main/othervm TLSClientPropertyTest SSLv3 + * @run main/othervm TLSClientPropertyTest TLSv1 + * @run main/othervm TLSClientPropertyTest TLSv11 + * @run main/othervm TLSClientPropertyTest TLSv12 + * @run main/othervm TLSClientPropertyTest WrongProperty + */ + +/** + * Sets the property jdk.tls.client.protocols to one of this protocols: + * SSLv3,TLSv1,TLSv1.1,TLSv1.2 and TLSV(invalid) or removes this + * property (if any),then validates the default, supported and current + * protocols in the SSLContext. + */ +public class TLSClientPropertyTest { + private final String[] expecteSupportedProtos = new String[] { + "SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2" + }; + + public static void main(String[] args) throws Exception { + + if (args.length < 1) { + throw new RuntimeException( + "Incorrect arguments,expected arguments: testCase"); + } + + String[] expectedDefaultProtos; + String testCase = args[0]; + String contextProtocol; + switch (testCase) { + case "NoProperty": + if (System.getProperty("jdk.tls.client.protocols") != null) { + System.getProperties().remove("jdk.tls.client.protocols"); + } + contextProtocol = null; + expectedDefaultProtos = new String[] { + "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2" + }; + break; + case "SSLv3": + contextProtocol = "SSLv3"; + expectedDefaultProtos = new String[] { + "SSLv3" + }; + break; + case "TLSv1": + contextProtocol = "TLSv1"; + expectedDefaultProtos = new String[] { + "SSLv3", "TLSv1" + }; + break; + case "TLSv11": + contextProtocol = "TLSv1.1"; + expectedDefaultProtos = new String[] { + "SSLv3", "TLSv1", "TLSv1.1" + }; + break; + case "TLSv12": + contextProtocol = "TLSv1.2"; + expectedDefaultProtos = new String[] { + "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2" + }; + break; + case "WrongProperty": + expectedDefaultProtos = new String[] {}; + contextProtocol = "TLSV"; + break; + default: + throw new RuntimeException("test case is wrong"); + } + if (contextProtocol != null) { + System.setProperty("jdk.tls.client.protocols", contextProtocol); + } + try { + TLSClientPropertyTest test = new TLSClientPropertyTest(); + test.test(contextProtocol, expectedDefaultProtos); + if (testCase.equals("WrongProperty")) { + throw new RuntimeException( + "Test failed: NoSuchAlgorithmException " + + "is expected when input wrong protocol"); + } else { + System.out.println("Test " + contextProtocol + " passed"); + } + } catch (NoSuchAlgorithmException nsae) { + if (testCase.equals("WrongProperty")) { + System.out.println("NoSuchAlgorithmException is expected," + + contextProtocol + " test passed"); + } else { + throw nsae; + } + } + + } + + /** + * The parameter passed is the user enforced protocol. Does not catch + * NoSuchAlgorithmException, WrongProperty test will use it. + */ + public void test(String expectedContextProto, + String[] expectedDefaultProtos) throws NoSuchAlgorithmException { + + SSLContext context = null; + try { + if (expectedContextProto != null) { + context = SSLContext.getInstance(expectedContextProto); + context.init(null, null, null); + } else { + context = SSLContext.getDefault(); + } + printContextDetails(context); + } catch (KeyManagementException ex) { + error(null, ex); + } + + validateContext(expectedContextProto, expectedDefaultProtos, context); + } + + /** + * Simple print utility for SSLContext's protocol details. + */ + private void printContextDetails(SSLContext context) { + System.out.println("Default Protocols: " + + Arrays.toString(context.getDefaultSSLParameters() + .getProtocols())); + System.out.println("Supported Protocols: " + + Arrays.toString(context.getSupportedSSLParameters() + .getProtocols())); + System.out.println("Current Protocol : " + context.getProtocol()); + + } + + /** + * Error handler. + */ + private void error(String msg, Throwable tble) { + String finalMsg = "FAILED " + (msg != null ? msg : ""); + if (tble != null) { + throw new RuntimeException(finalMsg, tble); + } + throw new RuntimeException(finalMsg); + } + + /** + * Validates the SSLContext's protocols against the user enforced protocol. + */ + private void validateContext(String expectedProto, + String[] expectedDefaultProtos, SSLContext context) { + if (expectedProto == null) { + expectedProto = "Default"; + } + if (!context.getProtocol().equals(expectedProto)) { + error("Invalid current protocol:" + context.getProtocol() + + ", Expected:" + expectedProto, null); + } + List actualDefaultProtos = Arrays.asList(context + .getDefaultSSLParameters().getProtocols()); + for (String p: expectedDefaultProtos) { + if (!actualDefaultProtos.contains(p)) { + error("Default protocol " + p + "missing", null); + } + } + List actualSupportedProtos = Arrays.asList(context + .getSupportedSSLParameters().getProtocols()); + + for (String p: expecteSupportedProtos) { + if (!actualSupportedProtos.contains(p)) { + error("Expected to support protocol:" + p, null); + } + } + } +} diff --git a/jdk/test/sun/security/krb5/auto/KDC.java b/jdk/test/sun/security/krb5/auto/KDC.java index 686e238579e..1b2814daf29 100644 --- a/jdk/test/sun/security/krb5/auto/KDC.java +++ b/jdk/test/sun/security/krb5/auto/KDC.java @@ -35,6 +35,7 @@ import sun.net.spi.nameservice.NameServiceDescriptor; import sun.security.krb5.*; import sun.security.krb5.internal.*; import sun.security.krb5.internal.ccache.CredentialsCache; +import sun.security.krb5.internal.crypto.EType; import sun.security.krb5.internal.crypto.KeyUsage; import sun.security.krb5.internal.ktab.KeyTab; import sun.security.util.DerInputStream; @@ -120,6 +121,9 @@ import sun.security.util.DerValue; */ public class KDC { + public static final int DEFAULT_LIFETIME = 39600; + public static final int DEFAULT_RENEWTIME = 86400; + // Under the hood. // The random generator to generate random keys (including session keys) @@ -204,7 +208,8 @@ public class KDC { * A standalone KDC server. */ public static void main(String[] args) throws Exception { - KDC kdc = create("RABBIT.HOLE", "kdc.rabbit.hole", 0, false); + int port = args.length > 0 ? Integer.parseInt(args[0]) : 0; + KDC kdc = create("RABBIT.HOLE", "kdc.rabbit.hole", port, false); kdc.addPrincipal("dummy", "bogus".toCharArray()); kdc.addPrincipal("foo", "bar".toCharArray()); kdc.addPrincipalRandKey("krbtgt/RABBIT.HOLE"); @@ -871,6 +876,14 @@ public class KDC { eTypes = KDCReqBodyDotEType(body); int eType = eTypes[0]; + // Maybe server does not support aes256, but a kinit does + if (!EType.isSupported(eType)) { + if (eTypes.length < 2) { + throw new KrbException(Krb5.KDC_ERR_ETYPE_NOSUPP); + } + eType = eTypes[1]; + } + EncryptionKey ckey = keyForUser(body.cname, eType, false); EncryptionKey skey = keyForUser(service, eType, true); @@ -899,10 +912,16 @@ public class KDC { EncryptionKey key = generateRandomKey(eType); // Check time, TODO KerberosTime till = body.till; + KerberosTime rtime = body.rtime; if (till == null) { throw new KrbException(Krb5.KDC_ERR_NEVER_VALID); // TODO } else if (till.isZero()) { - till = new KerberosTime(new Date().getTime() + 1000 * 3600 * 11); + till = new KerberosTime( + new Date().getTime() + 1000 * DEFAULT_LIFETIME); + } + if (rtime == null && body.kdcOptions.get(KDCOptions.RENEWABLE)) { + rtime = new KerberosTime( + new Date().getTime() + 1000 * DEFAULT_RENEWTIME); } //body.from boolean[] bFlags = new boolean[Krb5.TKT_OPTS_MAX+1]; @@ -1053,7 +1072,7 @@ public class KDC { new TransitedEncoding(1, new byte[0]), new KerberosTime(new Date()), body.from, - till, body.rtime, + till, rtime, body.addresses, null); Ticket t = new Ticket( @@ -1071,7 +1090,7 @@ public class KDC { tFlags, new KerberosTime(new Date()), body.from, - till, body.rtime, + till, rtime, service, body.addresses ); diff --git a/jdk/test/sun/security/krb5/auto/LifeTimeInSeconds.java b/jdk/test/sun/security/krb5/auto/LifeTimeInSeconds.java index 9c518ff6cbb..961990bdda7 100644 --- a/jdk/test/sun/security/krb5/auto/LifeTimeInSeconds.java +++ b/jdk/test/sun/security/krb5/auto/LifeTimeInSeconds.java @@ -40,7 +40,7 @@ public class LifeTimeInSeconds { int time = cred.getRemainingLifetime(); int time2 = cred.getRemainingInitLifetime(null); // The test KDC issues a TGT with a default lifetime of 11 hours - int elevenhrs = 11*3600; + int elevenhrs = KDC.DEFAULT_LIFETIME; if (time > elevenhrs+60 || time < elevenhrs-60) { throw new Exception("getRemainingLifetime returns wrong value."); } diff --git a/jdk/test/sun/security/krb5/auto/Renewal.java b/jdk/test/sun/security/krb5/auto/Renewal.java new file mode 100644 index 00000000000..fc9ab80e0d3 --- /dev/null +++ b/jdk/test/sun/security/krb5/auto/Renewal.java @@ -0,0 +1,164 @@ +/* + * Copyright (c) 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 8044500 + * @summary Add kinit options and krb5.conf flags that allow users to + * obtain renewable tickets and specify ticket lifetimes + * @library ../../../../java/security/testlibrary/ + * @compile -XDignore.symbol.file Renewal.java + * @run main/othervm Renewal + */ + +import sun.security.jgss.GSSUtil; +import sun.security.krb5.Config; +import sun.security.krb5.internal.ccache.Credentials; +import sun.security.krb5.internal.ccache.FileCredentialsCache; + +import javax.security.auth.kerberos.KerberosTicket; +import java.util.Date; +import java.util.Random; +import java.util.Set; + +// The basic krb5 test skeleton you can copy from +public class Renewal { + + static OneKDC kdc; + static String clazz = "sun.security.krb5.internal.tools.Kinit"; + + public static void main(String[] args) throws Exception { + + kdc = new OneKDC(null); + kdc.writeJAASConf(); + kdc.setOption(KDC.Option.PREAUTH_REQUIRED, false); + + checkLogin(null, null, KDC.DEFAULT_LIFETIME, -1); + checkLogin("1h", null, 3600, -1); + checkLogin(null, "2d", KDC.DEFAULT_LIFETIME, 86400*2); + checkLogin("1h", "10h", 3600, 36000); + // When rtime is before till, use till as rtime + checkLogin("10h", "1h", 36000, 36000); + + try { + Class.forName(clazz); + } catch (ClassNotFoundException cnfe) { + return; + } + + checkKinit(null, null, null, null, KDC.DEFAULT_LIFETIME, -1); + checkKinit("1h", "10h", null, null, 3600, 36000); + checkKinit(null, null, "30m", "5h", 1800, 18000); + checkKinit("1h", "10h", "30m", "5h", 1800, 18000); + + checkKinitRenew(); + } + + static int count = 0; + + static void checkKinit( + String s1, // ticket_lifetime in krb5.conf, null if none + String s2, // renew_lifetime in krb5.conf, null if none + String c1, // -l on kinit, null if none + String c2, // -r on kinit, null if none + int t1, int t2 // expected lifetimes, -1 of unexpected + ) throws Exception { + KDC.saveConfig(OneKDC.KRB5_CONF, kdc, + s1 != null ? ("ticket_lifetime = " + s1) : "", + s2 != null ? ("renew_lifetime = " + s2) : ""); + Proc p = Proc.create(clazz); + if (c1 != null) { + p.args("-l", c1); + } + if (c2 != null) { + p.args("-r", c2); + } + count++; + p.args(OneKDC.USER, new String(OneKDC.PASS)) + .inheritIO() + .prop("sun.net.spi.nameservice.provider.1", "ns,mock") + .prop("java.security.krb5.conf", OneKDC.KRB5_CONF) + .env("KRB5CCNAME", "ccache" + count) + .start(); + if (p.waitFor() != 0) { + throw new Exception(); + } + FileCredentialsCache fcc = + FileCredentialsCache.acquireInstance(null, "ccache" + count); + Credentials cred = fcc.getDefaultCreds(); + checkRough(cred.getEndTime().toDate(), t1); + if (cred.getRenewTill() == null) { + checkRough(null, t2); + } else { + checkRough(cred.getRenewTill().toDate(), t2); + } + } + + static void checkKinitRenew() throws Exception { + Proc p = Proc.create(clazz) + .args("-R") + .inheritIO() + .prop("sun.net.spi.nameservice.provider.1", "ns,mock") + .prop("java.security.krb5.conf", OneKDC.KRB5_CONF) + .env("KRB5CCNAME", "ccache" + count) + .start(); + if (p.waitFor() != 0) { + throw new Exception(); + } + } + + static void checkLogin( + String s1, // ticket_lifetime in krb5.conf, null if none + String s2, // renew_lifetime in krb5.conf, null if none + int t1, int t2 // expected lifetimes, -1 of unexpected + ) throws Exception { + KDC.saveConfig(OneKDC.KRB5_CONF, kdc, + s1 != null ? ("ticket_lifetime = " + s1) : "", + s2 != null ? ("renew_lifetime = " + s2) : ""); + Config.refresh(); + + Context c; + c = Context.fromJAAS("client"); + + Set tickets = + c.s().getPrivateCredentials(KerberosTicket.class); + if (tickets.size() != 1) { + throw new Exception(); + } + KerberosTicket ticket = tickets.iterator().next(); + + checkRough(ticket.getEndTime(), t1); + checkRough(ticket.getRenewTill(), t2); + } + + static void checkRough(Date t, int duration) throws Exception { + Date now = new Date(); + if (t == null && duration == -1) { + return; + } + long change = (t.getTime() - System.currentTimeMillis()) / 1000; + if (change > duration + 20 || change < duration - 20) { + throw new Exception(t + " is not " + duration); + } + } +} diff --git a/jdk/test/sun/security/krb5/config/Duration.java b/jdk/test/sun/security/krb5/config/Duration.java new file mode 100644 index 00000000000..d9c0f3961c7 --- /dev/null +++ b/jdk/test/sun/security/krb5/config/Duration.java @@ -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 8044500 + * @summary Add kinit options and krb5.conf flags that allow users to + * obtain renewable tickets and specify ticket lifetimes + * @compile -XDignore.symbol.file Duration.java + * @run main Duration + */ +import sun.security.krb5.Config; +import sun.security.krb5.KrbException; + +public class Duration { + public static void main(String[] args) throws Exception { + check("123", 123); + check("1:1", 3660); + check("1:1:1", 3661); + check("1d", 86400); + check("1h", 3600); + check("1h1m", 3660); + check("1h 1m", 3660); + check("1d 1h 1m 1s", 90061); + check("1d1h1m1s", 90061); + + check("", -1); + check("abc", -1); + check("1ms", -1); + check("1d1d", -1); + check("1h1d", -1); + check("x1h", -1); + check("1h x 1m", -1); + check(":", -1); + check("1:60", -1); + check("1:1:1:1", -1); + check("1:1:1:", -1); + } + + static void check(String s, int ex) throws Exception { + System.out.print("\u001b[1;37;41m" +s + " " + ex); + System.out.print("\u001b[m\n"); + try { + int result = Config.duration(s); + if (result != ex) throw new Exception("for " + s + " is " + result); + } catch (KrbException ke) { + ke.printStackTrace(); + if (ex != -1) throw new Exception(); + } + } +} diff --git a/jdk/test/tools/launcher/Arrrghs.java b/jdk/test/tools/launcher/Arrrghs.java index 62552c38959..0096f22ad3b 100644 --- a/jdk/test/tools/launcher/Arrrghs.java +++ b/jdk/test/tools/launcher/Arrrghs.java @@ -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 @@ -734,23 +734,6 @@ public class Arrrghs extends TestHelper { System.out.println(tr); } - @Test - static void testJreRestrictSearchFlag() { - // test both arguments to ensure they exist - TestResult tr = null; - tr = doExec(javaCmd, - "-no-jre-restrict-search", "-version"); - tr.checkPositive(); - if (!tr.testStatus) - System.out.println(tr); - - tr = doExec(javaCmd, - "-jre-restrict-search", "-version"); - tr.checkPositive(); - if (!tr.testStatus) - System.out.println(tr); - } - /** * @param args the command line arguments * @throws java.io.FileNotFoundException diff --git a/jdk/test/tools/launcher/MultipleJRE.sh b/jdk/test/tools/launcher/MultipleJRE.sh index 799d003e08f..61cac1b3eb9 100644 --- a/jdk/test/tools/launcher/MultipleJRE.sh +++ b/jdk/test/tools/launcher/MultipleJRE.sh @@ -5,7 +5,7 @@ # @build UglyPrintVersion # @build ZipMeUp # @run shell MultipleJRE.sh -# @summary Verify Multiple JRE version support +# @summary Verify Multiple JRE version support has been removed # @author Joseph E. Kowalski # @@ -222,37 +222,76 @@ CreateAlignedJar() { # long file name (path) or a long "Ext" entry, but adding the long # comment is the easiest way. # +MONDO=" Mondo comment line 00 is designed to take up space - lots and lots of space. Mondo comment line 01 is designed to take up space - lots and lots of space. Mondo comment line 02 is designed to take up space - lots and lots of space. Mondo comment line 03 is designed to take up space - lots and lots of space. Mondo comment line 04 is designed to take up space - lots and lots of space. Mondo comment line 05 is designed to take up space - lots and lots of space. Mondo comment line 06 is designed to take up space - lots and lots of space. Mondo comment line 07 is designed to take up space - lots and lots of space. Mondo comment line 08 is designed to take up space - lots and lots of space. Mondo comment line 09 is designed to take up space - lots and lots of space. Mondo comment line 0a is designed to take up space - lots and lots of space. Mondo comment line 0b is designed to take up space - lots and lots of space. Mondo comment line 0c is designed to take up space - lots and lots of space. Mondo comment line 0d is designed to take up space - lots and lots of space. Mondo comment line 0e is designed to take up space - lots and lots of space. Mondo comment line 0f is designed to take up space - lots and lots of space. Mondo comment line 10 is designed to take up space - lots and lots of space. Mondo comment line 11 is designed to take up space - lots and lots of space. Mondo comment line 12 is designed to take up space - lots and lots of space. Mondo comment line 13 is designed to take up space - lots and lots of space. Mondo comment line 14 is designed to take up space - lots and lots of space. Mondo comment line 15 is designed to take up space - lots and lots of space. Mondo comment line 16 is designed to take up space - lots and lots of space. Mondo comment line 17 is designed to take up space - lots and lots of space. Mondo comment line 18 is designed to take up space - lots and lots of space. Mondo comment line 19 is designed to take up space - lots and lots of space. Mondo comment line 1a is designed to take up space - lots and lots of space. Mondo comment line 1b is designed to take up space - lots and lots of space. Mondo comment line 1c is designed to take up space - lots and lots of space. Mondo comment line 1d is designed to take up space - lots and lots of space. Mondo comment line 1e is designed to take up space - lots and lots of space. Mondo comment line 1f is designed to take up space - lots and lots of space. Mondo comment line 20 is designed to take up space - lots and lots of space. Mondo comment line 21 is designed to take up space - lots and lots of space. Mondo comment line 22 is designed to take up space - lots and lots of space. Mondo comment line 23 is designed to take up space - lots and lots of space. Mondo comment line 24 is designed to take up space - lots and lots of space. Mondo comment line 25 is designed to take up space - lots and lots of space. Mondo comment line 26 is designed to take up space - lots and lots of space. Mondo comment line 27 is designed to take up space - lots and lots of space. Mondo comment line 28 is designed to take up space - lots and lots of space. Mondo comment line 29 is designed to take up space - lots and lots of space. Mondo comment line 2a is designed to take up space - lots and lots of space. Mondo comment line 2b is designed to take up space - lots and lots of space. Mondo comment line 2c is designed to take up space - lots and lots of space. Mondo comment line 2d is designed to take up space - lots and lots of space. Mondo comment line 2e is designed to take up space - lots and lots of space. Mondo comment line 2f is designed to take up space - lots and lots of space. Mondo comment line 30 is designed to take up space - lots and lots of space. Mondo comment line 31 is designed to take up space - lots and lots of space. Mondo comment line 32 is designed to take up space - lots and lots of space. Mondo comment line 33 is designed to take up space - lots and lots of space. Mondo comment line 34 is designed to take up space - lots and lots of space. Mondo comment line 35 is designed to take up space - lots and lots of space. Mondo comment line 36 is designed to take up space - lots and lots of space. Mondo comment line 37 is designed to take up space - lots and lots of space. Mondo comment line 38 is designed to take up space - lots and lots of space. Mondo comment line 39 is designed to take up space - lots and lots of space. Mondo comment line 3a is designed to take up space - lots and lots of space. Mondo comment line 3b is designed to take up space - lots and lots of space. Mondo comment line 3c is designed to take up space - lots and lots of space. Mondo comment line 3d is designed to take up space - lots and lots of space. Mondo comment line 3e is designed to take up space - lots and lots of space. Mondo comment line 3f is designed to take up space - lots and lots of space. Mondo comment line 40 is designed to take up space - lots and lots of space. Mondo comment line 41 is designed to take up space - lots and lots of space. Mondo comment line 42 is designed to take up space - lots and lots of space. Mondo comment line 43 is designed to take up space - lots and lots of space. Mondo comment line 44 is designed to take up space - lots and lots of space. Mondo comment line 45 is designed to take up space - lots and lots of space. Mondo comment line 46 is designed to take up space - lots and lots of space. Mondo comment line 47 is designed to take up space - lots and lots of space. Mondo comment line 48 is designed to take up space - lots and lots of space. Mondo comment line 49 is designed to take up space - lots and lots of space. Mondo comment line 4a is designed to take up space - lots and lots of space. Mondo comment line 4b is designed to take up space - lots and lots of space. Mondo comment line 4c is designed to take up space - lots and lots of space. Mondo comment line 4d is designed to take up space - lots and lots of space. Mondo comment line 4e is designed to take up space - lots and lots of space. Mondo comment line 4f is designed to take up space - lots and lots of space. Mondo comment line 50 is designed to take up space - lots and lots of space. Mondo comment line 51 is designed to take up space - lots and lots of space. Mondo comment line 52 is designed to take up space - lots and lots of space. Mondo comment line 53 is designed to take up space - lots and lots of space. Mondo comment line 54 is designed to take up space - lots and lots of space. Mondo comment line 55 is designed to take up space - lots and lots of space. Mondo comment line 56 is designed to take up space - lots and lots of space. Mondo comment line 57 is designed to take up space - lots and lots of space. Mondo comment line 58 is designed to take up space - lots and lots of space. Mondo comment line 59 is designed to take up space - lots and lots of space. Mondo comment line 5a is designed to take up space - lots and lots of space. Mondo comment line 5b is designed to take up space - lots and lots of space. Mondo comment line 5c is designed to take up space - lots and lots of space. Mondo comment line 5d is designed to take up space - lots and lots of space. Mondo comment line 5e is designed to take up space - lots and lots of space. Mondo comment line 5f is designed to take up space - lots and lots of space. Mondo comment line 60 is designed to take up space - lots and lots of space. Mondo comment line 61 is designed to take up space - lots and lots of space. Mondo comment line 62 is designed to take up space - lots and lots of space. Mondo comment line 63 is designed to take up space - lots and lots of space. Mondo comment line 64 is designed to take up space - lots and lots of space. Mondo comment line 65 is designed to take up space - lots and lots of space. Mondo comment line 66 is designed to take up space - lots and lots of space. Mondo comment line 67 is designed to take up space - lots and lots of space. Mondo comment line 68 is designed to take up space - lots and lots of space. Mondo comment line 69 is designed to take up space - lots and lots of space. Mondo comment line 6a is designed to take up space - lots and lots of space. Mondo comment line 6b is designed to take up space - lots and lots of space. Mondo comment line 6c is designed to take up space - lots and lots of space. Mondo comment line 6d is designed to take up space - lots and lots of space. Mondo comment line 6e is designed to take up space - lots and lots of space. Mondo comment line 6f is designed to take up space - lots and lots of space. Mondo comment line 70 is designed to take up space - lots and lots of space. Mondo comment line 71 is designed to take up space - lots and lots of space. Mondo comment line 72 is designed to take up space - lots and lots of space. Mondo comment line 73 is designed to take up space - lots and lots of space. Mondo comment line 74 is designed to take up space - lots and lots of space. Mondo comment line 75 is designed to take up space - lots and lots of space. Mondo comment line 76 is designed to take up space - lots and lots of space. Mondo comment line 77 is designed to take up space - lots and lots of space. Mondo comment line 78 is designed to take up space - lots and lots of space. Mondo comment line 79 is designed to take up space - lots and lots of space. Mondo comment line 7a is designed to take up space - lots and lots of space. Mondo comment line 7b is designed to take up space - lots and lots of space. Mondo comment line 7c is designed to take up space - lots and lots of space. Mondo comment line 7d is designed to take up space - lots and lots of space. Mondo comment line 7e is designed to take up space - lots and lots of space. Mondo comment line 7f is designed to take up space - lots and lots of space. Mondo comment line 80 is designed to take up space - lots and lots of space. Mondo comment line 81 is designed to take up space - lots and lots of space. Mondo comment line 82 is designed to take up space - lots and lots of space. Mondo comment line 83 is designed to take up space - lots and lots of space. Mondo comment line 84 is designed to take up space - lots and lots of space. Mondo comment line 85 is designed to take up space - lots and lots of space. Mondo comment line 86 is designed to take up space - lots and lots of space. Mondo comment line 87 is designed to take up space - lots and lots of space. Mondo comment line 88 is designed to take up space - lots and lots of space. Mondo comment line 89 is designed to take up space - lots and lots of space. Mondo comment line 8a is designed to take up space - lots and lots of space. Mondo comment line 8b is designed to take up space - lots and lots of space. Mondo comment line 8c is designed to take up space - lots and lots of space. Mondo comment line 8d is designed to take up space - lots and lots of space. Mondo comment line 8e is designed to take up space - lots and lots of space. Mondo comment line 8f is designed to take up space - lots and lots of space. Mondo comment line 90 is designed to take up space - lots and lots of space. Mondo comment line 91 is designed to take up space - lots and lots of space. Mondo comment line 92 is designed to take up space - lots and lots of space. Mondo comment line 93 is designed to take up space - lots and lots of space. Mondo comment line 94 is designed to take up space - lots and lots of space. Mondo comment line 95 is designed to take up space - lots and lots of space. Mondo comment line 96 is designed to take up space - lots and lots of space. Mondo comment line 97 is designed to take up space - lots and lots of space. Mondo comment line 98 is designed to take up space - lots and lots of space. Mondo comment line 99 is designed to take up space - lots and lots of space. Mondo comment line 9a is designed to take up space - lots and lots of space. Mondo comment line 9b is designed to take up space - lots and lots of space. Mondo comment line 9c is designed to take up space - lots and lots of space. Mondo comment line 9d is designed to take up space - lots and lots of space. Mondo comment line 9e is designed to take up space - lots and lots of space. Mondo comment line 9f is designed to take up space - lots and lots of space. Mondo comment line a0 is designed to take up space - lots and lots of space. Mondo comment line a1 is designed to take up space - lots and lots of space. Mondo comment line a2 is designed to take up space - lots and lots of space. Mondo comment line a3 is designed to take up space - lots and lots of space. Mondo comment line a4 is designed to take up space - lots and lots of space. Mondo comment line a5 is designed to take up space - lots and lots of space. Mondo comment line a6 is designed to take up space - lots and lots of space. Mondo comment line a7 is designed to take up space - lots and lots of space. Mondo comment line a8 is designed to take up space - lots and lots of space. Mondo comment line a9 is designed to take up space - lots and lots of space. Mondo comment line aa is designed to take up space - lots and lots of space. Mondo comment line ab is designed to take up space - lots and lots of space. Mondo comment line ac is designed to take up space - lots and lots of space. Mondo comment line ad is designed to take up space - lots and lots of space. Mondo comment line ae is designed to take up space - lots and lots of space. Mondo comment line af is designed to take up space - lots and lots of space. Mondo comment line b0 is designed to take up space - lots and lots of space. Mondo comment line b1 is designed to take up space - lots and lots of space. Mondo comment line b2 is designed to take up space - lots and lots of space. Mondo comment line b3 is designed to take up space - lots and lots of space. Mondo comment line b4 is designed to take up space - lots and lots of space. Mondo comment line b5 is designed to take up space - lots and lots of space. Mondo comment line b6 is designed to take up space - lots and lots of space. Mondo comment line b7 is designed to take up space - lots and lots of space. Mondo comment line b8 is designed to take up space - lots and lots of space. Mondo comment line b9 is designed to take up space - lots and lots of space. Mondo comment line ba is designed to take up space - lots and lots of space. Mondo comment line bb is designed to take up space - lots and lots of space. Mondo comment line bc is designed to take up space - lots and lots of space. Mondo comment line bd is designed to take up space - lots and lots of space. Mondo comment line be is designed to take up space - lots and lots of space. Mondo comment line bf is designed to take up space - lots and lots of space. Mondo comment line c0 is designed to take up space - lots and lots of space. Mondo comment line c1 is designed to take up space - lots and lots of space. Mondo comment line c2 is designed to take up space - lots and lots of space. Mondo comment line c3 is designed to take up space - lots and lots of space. Mondo comment line c4 is designed to take up space - lots and lots of space. Mondo comment line c5 is designed to take up space - lots and lots of space. Mondo comment line c6 is designed to take up space - lots and lots of space. Mondo comment line c7 is designed to take up space - lots and lots of space. Mondo comment line c8 is designed to take up space - lots and lots of space. Mondo comment line c9 is designed to take up space - lots and lots of space. Mondo comment line ca is designed to take up space - lots and lots of space. Mondo comment line cb is designed to take up space - lots and lots of space. Mondo comment line cc is designed to take up space - lots and lots of space. Mondo comment line cd is designed to take up space - lots and lots of space. Mondo comment line ce is designed to take up space - lots and lots of space. Mondo comment line cf is designed to take up space - lots and lots of space. Mondo comment line d0 is designed to take up space - lots and lots of space. Mondo comment line d1 is designed to take up space - lots and lots of space. Mondo comment line d2 is designed to take up space - lots and lots of space. Mondo comment line d3 is designed to take up space - lots and lots of space. Mondo comment line d4 is designed to take up space - lots and lots of space. Mondo comment line d5 is designed to take up space - lots and lots of space. Mondo comment line d6 is designed to take up space - lots and lots of space. Mondo comment line d7 is designed to take up space - lots and lots of space. Mondo comment line d8 is designed to take up space - lots and lots of space. Mondo comment line d9 is designed to take up space - lots and lots of space. Mondo comment line da is designed to take up space - lots and lots of space. Mondo comment line db is designed to take up space - lots and lots of space. Mondo comment line dc is designed to take up space - lots and lots of space. Mondo comment line dd is designed to take up space - lots and lots of space. Mondo comment line de is designed to take up space - lots and lots of space. Mondo comment line df is designed to take up space - lots and lots of space. Mondo comment line e0 is designed to take up space - lots and lots of space. Mondo comment line e1 is designed to take up space - lots and lots of space. Mondo comment line e2 is designed to take up space - lots and lots of space. Mondo comment line e3 is designed to take up space - lots and lots of space. Mondo comment line e4 is designed to take up space - lots and lots of space. Mondo comment line e5 is designed to take up space - lots and lots of space. Mondo comment line e6 is designed to take up space - lots and lots of space. Mondo comment line e7 is designed to take up space - lots and lots of space. Mondo comment line e8 is designed to take up space - lots and lots of space. Mondo comment line e9 is designed to take up space - lots and lots of space. Mondo comment line ea is designed to take up space - lots and lots of space. Mondo comment line eb is designed to take up space - lots and lots of space. Mondo comment line ec is designed to take up space - lots and lots of space. Mondo comment line ed is designed to take up space - lots and lots of space. Mondo comment line ee is designed to take up space - lots and lots of space. Mondo comment line ef is designed to take up space - lots and lots of space. Mondo comment line f0 is designed to take up space - lots and lots of space. Mondo comment line f1 is designed to take up space - lots and lots of space. Mondo comment line f2 is designed to take up space - lots and lots of space. Mondo comment line f3 is designed to take up space - lots and lots of space. Mondo comment line f4 is designed to take up space - lots and lots of space. Mondo comment line f5 is designed to take up space - lots and lots of space. Mondo comment line f6 is designed to take up space - lots and lots of space. Mondo comment line f7 is designed to take up space - lots and lots of space. Mondo comment line f8 is designed to take up space - lots and lots of space. Mondo comment line f9 is designed to take up space - lots and lots of space. Mondo comment line fa is designed to take up space - lots and lots of space. Mondo comment line fb is designed to take up space - lots and lots of space. Mondo comment line fc is designed to take up space - lots and lots of space. Mondo comment line fd is designed to take up space - lots and lots of space. Mondo comment line fe is designed to take up space - lots and lots of space. Mondo comment line ff is designed to take up space - lots and lots of space." CommentZipFile() { - file= - tail="is designed to take up space - lots and lots of space." - mv PrintVersion PrintVersion.zip - /usr/bin/zipnote PrintVersion.zip > zipout - while read ampersand line; do - if [ "$ampersand" = "@" ]; then - if [ "$line" = "(comment above this line)" ]; then - echo "File Comment Line." >> zipin - if [ "$file" = "$1" ]; then - for i in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do - for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f; do - echo "Mondo comment line $i$j $tail" >> zipin - done - done - fi - else - file=$line - fi + mkdir -p META-INF + echo "Manifest-Version: 1.0" > META-INF/MANIFEST.MF + echo "Main-Class: PrintVersion" >> META-INF/MANIFEST.MF + if [ "$1" != "" ]; then + echo "JRE-Version: $1" >> META-INF/MANIFEST.MF fi - echo "$ampersand $line" >> zipin - if [ "$ampersand" = "@" ]; then - if [ "$line" = "(zip file comment below this line)" ]; then - echo "Zip File Comment Line number 1" >> zipin - echo "Zip File Comment Line number 2" >> zipin - fi - fi - done < zipout - /usr/bin/zipnote -w PrintVersion.zip < zipin + cp $TESTCLASSES/PrintVersion.class . + + # The remaining code in CommentZipFile essentially replaces the + # following code, which added comments to the jar file. + # Unfortunately zipnote has been broken since 3.0 [ 2008 ] and + # there has been no new [ fixed ] version. zipnote has probably + # always failed, or failed for a long time without causing the + # test to fail. So no comments were added to the file. + # The comments are added using zip(1) during the creation of the + # zip file. + # + # NOTE: + # It seems the original intent of this test was to add a very long + # comment for one file. But zip allows a max of 256 characters, so + # we settle for adding 256-character comments to lots of files. + # + # $JAR $2cMf PrintVersion PrintVersion.class AfairlyLong* + # $JAR $2umf META-INF/MANIFEST.MF PrintVersion + # /usr/bin/zipnote PrintVersion.zip > zipout + # ... code to modify zipout adding comments + # /usr/bin/zipnote -w PrintVersion.zip < zipin + # mv PrintVersion.zip PrintVersion + # + + + for i in 0 1 2 3 4 5 6 7 8 9 ; do + for j in 0 1 2 3 4 5 6 7 8 9 ; do + touch AfairlyLongNameEatsUpDirectorySpaceBetter$i$j + done + done + + zip -$2c PrintVersion.zip PrintVersion.class AfairlyLong* META-INF/MANIFEST.MF << FINI +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +File Comment Line. +$MONDO +File Comment Line. +File Comment Line. +File Comment Line. +FINI + + rm -f AfairlyLong* + mv PrintVersion.zip PrintVersion - rm zipout zipin + } # @@ -261,22 +300,29 @@ CommentZipFile() { # LaunchVM() { if [ "$1" != "" ]; then - mess="`$JAVA -version:\"$1\" -jar PrintVersion 2>&1`" - else - mess="`$JAVA -jar PrintVersion 2>&1`" - fi - if [ $? -ne 0 ]; then - prefix=`echo "$mess" | cut -d ' ' -f 1-3` - if [ "$prefix" != "Unable to locate" ]; then + mess="`$JAVA \"$1\" -jar PrintVersion 2>&1`" + if [ $? -eq 0 ]; then + echo "Unexpected success of -Version:$1" echo "$mess" exit 1 fi - echo "Unexpected error in attempting to locate $1" - exit 1 + else + mess="`$JAVA -jar PrintVersion 2>&1`" + if [ $? -ne 0 ]; then + prefix=`echo "$mess" | cut -d ' ' -f 1-3` + if [ "$prefix" != "Unable to locate" ]; then + echo "$mess" + exit 1 + fi + echo "Unexpected error in attempting to locate $1" + exit 1 + fi + fi + echo $mess | grep "$2" > /dev/null 2>&1 if [ $? != 0 ]; then - echo "Launched $mess, expected $2" + echo "Launched $mess, expected $1" exit 1 fi } @@ -307,6 +353,7 @@ TestLongMainClass() { # # Main test sequence starts here # + RELEASE=`$JAVA -version 2>&1 | head -n 1 | cut -d ' ' -f 3 | \ sed -e "s/\"//g"` BASE_RELEASE=`echo $RELEASE | sed -e "s/-.*//g"` @@ -386,91 +433,31 @@ if [ -x /usr/bin/zipnote ]; then fi # -# Throw some syntactically challenged (illegal) version specifiers at -# the interface. Failure (of the launcher) is success for the test. +# Now test specification of mJRE +# +# In some cases this should result in failure of the command, +# in some cases, a warning messages, with the command succeeding. # -TestSyntax "1.2..3" # Two adjacent separators -TestSyntax "_1.2.3" # Begins with a separator -TestSyntax "1.2.3-" # Ends with a separator -TestSyntax "1.2+.3" # Embedded modifier -TestSyntax "1.2.4+&1.2*&1++" # Long and invalid -# On windows we see if there is another jre installed, usually -# there is, then we test using that, otherwise links are created -# to get through to SelectVersion. -if [ `IsWindows` = "false" ]; then - TestLongMainClass "mklink" -else - $JAVAEXE -version:1.0+ - if [ $? -eq 0 ]; then - TestLongMainClass "1.0+" - else - printf "Warning: TestLongMainClass skipped as there is no" - printf "viable MJRE installed.\n" - fi -fi + # Commandline use of "-version:" should fail + # with a message containing "no longer supported" + LaunchVM "-version:1.10+" "Error: Specifying an alternate JDK/JRE" + LaunchVM "-version:prettymuchanything" "Error: Specifying an alternate JDK/JRE" -# -# Because scribbling in the registry can be rather destructive, only a -# subset of the tests are run on Windows. -# -if [ `IsWindows` = "true" ]; then - exit 0; -fi + # Commandline use of "-jre-restrict-search" should now fail + LaunchVM "-jre-restrict-search" "\-jre\-no\-restrict\-search are also no longer valid" + # Commandline use of "-jre-no-restrict-search" should now fail + LaunchVM "-jre-no-restrict-search" "\-jre\-no\-restrict\-search are also no longer valid" -# -# Additional version specifiers containing spaces. (Sigh, unable to -# figure out the glomming on Windows) -# -TestSyntax "1.2.3_99 1.3.2+ 1.2.4+&1.2*&1++" # Long and invalid -# -# Create a mock installation of a number of shell scripts named as though -# they were installed JREs. Then test to see if the launcher can cause -# the right shell scripts to be invoked. -# -# Note, that as a side effect, this test verifies that JAVA_VERSION_PATH -# works. -# -rm -rf jdk -JAVA_VERSION_PATH="`pwd`/jdk" -export JAVA_VERSION_PATH - -CreateMockVM 1.10 -CreateMockVM 1.11.3 -CreateMockVM 1.11.3_03 -CreateMockVM 1.11.4 -CreateMockVM 1.12.3_03 -CreateMockVM 1.12.3_03-lastweek -CreateMockVM 1.13.3_03 -CreateMockVM 1.13.3_03-lastweek -CreateMockVM 1.13.3_03_lastweek -CreateMockVM 1.20.0 - -# -# Test extracting the version information from the jar file: -# -# Requested Expected -CreateJar "1.10+" "" -LaunchVM "" "1.20.0" -CreateJar "1.11.3_03+&1.11*" "" -LaunchVM "" "1.11.4" -CreateJar "1.12.3_03+&1.12.3*" "" -LaunchVM "" "1.12.3_03" -CreateJar "1.13.3_03+&1.13.3*" "" -LaunchVM "" "1.13.3_03_lastweek" # Strange but true - -# -# Test obtaining the version information from the command line (and that -# it overrides the manifest). -# -CreateJar "${BASERELEASE}*" "" -LaunchVM "1.10+" "1.20.0" -LaunchVM "1.11.3_03+&1.11*" "1.11.4" -LaunchVM "1.12.3_03+&1.12.3*" "1.12.3_03" -LaunchVM "1.13.3_03+&1.13.3*" "1.13.3_03_lastweek" # Strange but true - -[ -d jdk ] && rm -rf jdk -[ -d META_INF ] && rm -rf META_INF + # mJRE directives to use a specific version should be flagged + # with a warning, but the jar should be executed with the + # current jre + CreateFullJar "junk request" "" + LaunchVM "" "${RELEASE}" + # Going to silently ignore JRE-Version setting in jar file manifest + #LaunchVM "" "warning: The jarfile JRE-Version" + exit 0 + diff --git a/jdk/test/tools/launcher/VersionCheck.java b/jdk/test/tools/launcher/VersionCheck.java index 59e0973b468..d7044446588 100644 --- a/jdk/test/tools/launcher/VersionCheck.java +++ b/jdk/test/tools/launcher/VersionCheck.java @@ -69,6 +69,7 @@ public class VersionCheck extends TestHelper { "java-rmi", "java-rmi.cgi", "javadoc", + "javacpl", "javaws", "jcmd", "jconsole", diff --git a/jdk/test/tools/pack200/Pack200Props.java b/jdk/test/tools/pack200/Pack200Props.java index e9d14322907..dcb90548be8 100644 --- a/jdk/test/tools/pack200/Pack200Props.java +++ b/jdk/test/tools/pack200/Pack200Props.java @@ -62,6 +62,8 @@ public class Pack200Props { List cmdsList = new ArrayList<>(); cmdsList.add(Utils.getPack200Cmd()); + cmdsList.add("-J-Xshare:off"); + cmdsList.add("-J-Xmx1280m"); cmdsList.add("--effort=1"); cmdsList.add("--verbose"); cmdsList.add("--no-gzip"); diff --git a/jdk/test/tools/pack200/Pack200Test.java b/jdk/test/tools/pack200/Pack200Test.java index 5d7fc105745..69cec754a07 100644 --- a/jdk/test/tools/pack200/Pack200Test.java +++ b/jdk/test/tools/pack200/Pack200Test.java @@ -34,7 +34,7 @@ import java.util.jar.*; * @summary check for memory leaks, test general packer/unpacker functionality\ * using native and java unpackers * @compile -XDignore.symbol.file Utils.java Pack200Test.java - * @run main/othervm/timeout=1200 -Xmx512m Pack200Test + * @run main/othervm/timeout=1200 -Xmx1280m -Xshare:off Pack200Test * @author ksrini */ diff --git a/langtools/.hgtags b/langtools/.hgtags index 700d0f2b95e..7bd86ea5a39 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -284,3 +284,4 @@ c536541235e566701ff772700c15de14b75e2979 jdk9-b36 5ff1cd07bd9297e82cfea5ec01249d162260fe4e jdk9-b39 c286272a81dd8f6005e22fed0238c4a3f75188c7 jdk9-b40 f7ce2cfa4cdbec0ae0f46080484eace66be7987a jdk9-b41 +23a3a063a906a91ba696d792f0eeabf157cd2f86 jdk9-b42 diff --git a/langtools/make/build.xml b/langtools/make/build.xml index d2e543a6d56..8eff38083aa 100644 --- a/langtools/make/build.xml +++ b/langtools/make/build.xml @@ -422,6 +422,8 @@ + + diff --git a/langtools/make/intellij/build.xml b/langtools/make/intellij/build.xml index c67b66555d0..3494aec4443 100644 --- a/langtools/make/intellij/build.xml +++ b/langtools/make/intellij/build.xml @@ -14,14 +14,14 @@ - + - + diff --git a/langtools/make/intellij/compiler.xml b/langtools/make/intellij/compiler.xml index ad56f326588..552c480a158 100644 --- a/langtools/make/intellij/compiler.xml +++ b/langtools/make/intellij/compiler.xml @@ -13,6 +13,6 @@ - + diff --git a/langtools/make/intellij/copyright/langtools.xml b/langtools/make/intellij/copyright/langtools.xml index d9938bc6a04..b12ea2fb0ee 100644 --- a/langtools/make/intellij/copyright/langtools.xml +++ b/langtools/make/intellij/copyright/langtools.xml @@ -6,4 +6,4 @@