diff --git a/.hgtags b/.hgtags index 0e1e6146c83..25861ade374 100644 --- a/.hgtags +++ b/.hgtags @@ -310,3 +310,5 @@ e7dbbef69d12b6a74dfad331b7188e7f893e8d29 jdk9-b62 4915246064b2f89d5f00c96e758686b7fdad36a6 jdk9-b65 ff3fc75f3214ad7e03595be1b0d0f38d887b6f0e jdk9-b66 56166ce66037952fa21e9f680b31bf8eb47312c0 jdk9-b67 +5b500c93ce4822d47061cd518ff3f72d9d8cb5b5 jdk9-b68 +d69c968463f0ae5d0b45de3fc14fe65171b23948 jdk9-b69 diff --git a/.hgtags-top-repo b/.hgtags-top-repo index 3b7f5316ae8..85bad55aac1 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -310,3 +310,5 @@ ea38728b4f4bdd8fd0d7a89b18069f521cf05013 jdk9-b61 7c31f9d7b932f7924f1258d52885b1c7c3e078c2 jdk9-b65 dc6e8336f51bb6b67b7245766179eab5ca7720b4 jdk9-b66 f546760134eb861fcfecd4ce611b0040b0d25a6a jdk9-b67 +70e4272790b6199e9ca89df2758ff9cb58ec4125 jdk9-b68 +1bcfd6b8726582cff5a42dbfc75903e36f9dd4fe jdk9-b69 diff --git a/common/autoconf/basics.m4 b/common/autoconf/basics.m4 index a9d1034eae0..858ed2e9ea7 100644 --- a/common/autoconf/basics.m4 +++ b/common/autoconf/basics.m4 @@ -436,7 +436,6 @@ AC_DEFUN_ONCE([BASIC_SETUP_FUNDAMENTAL_TOOLS], BASIC_PATH_PROGS(CYGPATH, cygpath) BASIC_PATH_PROGS(READLINK, [greadlink readlink]) BASIC_PATH_PROGS(DF, df) - BASIC_PATH_PROGS(SETFILE, SetFile) BASIC_PATH_PROGS(CPIO, [cpio bsdcpio]) ]) @@ -574,10 +573,11 @@ AC_DEFUN_ONCE([BASIC_SETUP_DEVKIT], ) if test "x$OPENJDK_BUILD_OS" = "xmacosx"; then - # detect if Xcode is installed by running xcodebuild -version + # If a devkit has been supplied, find xcodebuild in the toolchain_path. + # If not, detect if Xcode is installed by running xcodebuild -version # if no Xcode installed, xcodebuild exits with 1 # if Xcode is installed, even if xcode-select is misconfigured, then it exits with 0 - if /usr/bin/xcodebuild -version >/dev/null 2>&1; then + if test "x$DEVKIT_ROOT" != x || /usr/bin/xcodebuild -version >/dev/null 2>&1; then # We need to use xcodebuild in the toolchain dir provided by the user, this will # fall back on the stub binary in /usr/bin/xcodebuild AC_PATH_PROG([XCODEBUILD], [xcodebuild], [/usr/bin/xcodebuild], [$TOOLCHAIN_PATH]) @@ -961,6 +961,7 @@ AC_DEFUN_ONCE([BASIC_SETUP_COMPLEX_TOOLS], AC_MSG_RESULT([yes]) fi fi + BASIC_REQUIRE_PROGS(SETFILE, SetFile) fi ]) diff --git a/common/autoconf/build-aux/config.guess b/common/autoconf/build-aux/config.guess index a450a2760f6..148a61a8ab8 100644 --- a/common/autoconf/build-aux/config.guess +++ b/common/autoconf/build-aux/config.guess @@ -86,4 +86,11 @@ if [ "x$OUT" = x ]; then fi fi +# Test and fix cpu on Macosx when C preprocessor is not on the path +echo $OUT | grep i386-apple-darwin > /dev/null 2> /dev/null +if test $? = 0; then + REAL_CPU=`uname -m` + OUT=$REAL_CPU`echo $OUT | sed -e 's/[^-]*//'` +fi + echo $OUT diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh index f262cf48b17..446fadaba6a 100644 --- a/common/autoconf/generated-configure.sh +++ b/common/autoconf/generated-configure.sh @@ -855,6 +855,7 @@ OS_VERSION_MINOR OS_VERSION_MAJOR PKG_CONFIG BASH_ARGS +SETFILE CODESIGN XATTR DSYMUTIL @@ -946,7 +947,6 @@ build_vendor build_cpu build CPIO -SETFILE DF READLINK CYGPATH @@ -1167,7 +1167,6 @@ SED CYGPATH READLINK DF -SETFILE CPIO UNZIP ZIP @@ -1180,6 +1179,7 @@ TIME DSYMUTIL XATTR CODESIGN +SETFILE PKG_CONFIG JAVA JAVAC @@ -2049,7 +2049,6 @@ Some influential environment variables: CYGPATH Override default value for CYGPATH READLINK Override default value for READLINK DF Override default value for DF - SETFILE Override default value for SETFILE CPIO Override default value for CPIO UNZIP Override default value for UNZIP ZIP Override default value for ZIP @@ -2062,6 +2061,7 @@ Some influential environment variables: DSYMUTIL Override default value for DSYMUTIL XATTR Override default value for XATTR CODESIGN Override default value for CODESIGN + SETFILE Override default value for SETFILE PKG_CONFIG path to pkg-config utility JAVA Override default value for JAVA JAVAC Override default value for JAVAC @@ -4364,7 +4364,7 @@ VS_SDK_PLATFORM_NAME_2013= #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1433337614 +DATE_WHEN_GENERATED=1434614912 ############################################################################### # @@ -13055,192 +13055,6 @@ $as_echo "$tool_specified" >&6; } - # Publish this variable in the help. - - - if test "x$SETFILE" = x; then - # The variable is not set by user, try to locate tool using the code snippet - for ac_prog in SetFile -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_SETFILE+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $SETFILE in - [\\/]* | ?:[\\/]*) - ac_cv_path_SETFILE="$SETFILE" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_SETFILE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -SETFILE=$ac_cv_path_SETFILE -if test -n "$SETFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5 -$as_echo "$SETFILE" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$SETFILE" && break -done - - else - # The variable is set, but is it from the command line or the environment? - - # Try to remove the string !SETFILE! from our list. - try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!SETFILE!/} - if test "x$try_remove_var" = "x$CONFIGURE_OVERRIDDEN_VARIABLES"; then - # If it failed, the variable was not from the command line. Ignore it, - # but warn the user (except for BASH, which is always set by the calling BASH). - if test "xSETFILE" != xBASH; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring value of SETFILE from the environment. Use command line variables instead." >&5 -$as_echo "$as_me: WARNING: Ignoring value of SETFILE from the environment. Use command line variables instead." >&2;} - fi - # Try to locate tool using the code snippet - for ac_prog in SetFile -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_SETFILE+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $SETFILE in - [\\/]* | ?:[\\/]*) - ac_cv_path_SETFILE="$SETFILE" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_SETFILE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -SETFILE=$ac_cv_path_SETFILE -if test -n "$SETFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5 -$as_echo "$SETFILE" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$SETFILE" && break -done - - else - # If it succeeded, then it was overridden by the user. We will use it - # for the tool. - - # First remove it from the list of overridden variables, so we can test - # for unknown variables in the end. - CONFIGURE_OVERRIDDEN_VARIABLES="$try_remove_var" - - # Check if the provided tool contains a complete path. - tool_specified="$SETFILE" - tool_basename="${tool_specified##*/}" - if test "x$tool_basename" = "x$tool_specified"; then - # A command without a complete path is provided, search $PATH. - { $as_echo "$as_me:${as_lineno-$LINENO}: Will search for user supplied tool SETFILE=$tool_basename" >&5 -$as_echo "$as_me: Will search for user supplied tool SETFILE=$tool_basename" >&6;} - # Extract the first word of "$tool_basename", so it can be a program name with args. -set dummy $tool_basename; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_SETFILE+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $SETFILE in - [\\/]* | ?:[\\/]*) - ac_cv_path_SETFILE="$SETFILE" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_SETFILE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -SETFILE=$ac_cv_path_SETFILE -if test -n "$SETFILE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5 -$as_echo "$SETFILE" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - if test "x$SETFILE" = x; then - as_fn_error $? "User supplied tool $tool_basename could not be found" "$LINENO" 5 - fi - else - # Otherwise we believe it is a complete path. Use it as it is. - { $as_echo "$as_me:${as_lineno-$LINENO}: Will use user supplied tool SETFILE=$tool_specified" >&5 -$as_echo "$as_me: Will use user supplied tool SETFILE=$tool_specified" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SETFILE" >&5 -$as_echo_n "checking for SETFILE... " >&6; } - if test ! -x "$tool_specified"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 -$as_echo "not found" >&6; } - as_fn_error $? "User supplied tool SETFILE=$tool_specified does not exist or is not executable" "$LINENO" 5 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tool_specified" >&5 -$as_echo "$tool_specified" >&6; } - fi - fi - fi - - - - # Publish this variable in the help. @@ -15140,10 +14954,11 @@ fi if test "x$OPENJDK_BUILD_OS" = "xmacosx"; then - # detect if Xcode is installed by running xcodebuild -version + # If a devkit has been supplied, find xcodebuild in the toolchain_path. + # If not, detect if Xcode is installed by running xcodebuild -version # if no Xcode installed, xcodebuild exits with 1 # if Xcode is installed, even if xcode-select is misconfigured, then it exits with 0 - if /usr/bin/xcodebuild -version >/dev/null 2>&1; then + if test "x$DEVKIT_ROOT" != x || /usr/bin/xcodebuild -version >/dev/null 2>&1; then # We need to use xcodebuild in the toolchain dir provided by the user, this will # fall back on the stub binary in /usr/bin/xcodebuild # Extract the first word of "xcodebuild", so it can be a program name with args. @@ -19653,6 +19468,199 @@ $as_echo "no" >&6; } $as_echo "yes" >&6; } fi fi + + + + # Publish this variable in the help. + + + if test "x$SETFILE" = x; then + # The variable is not set by user, try to locate tool using the code snippet + for ac_prog in SetFile +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_SETFILE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $SETFILE in + [\\/]* | ?:[\\/]*) + ac_cv_path_SETFILE="$SETFILE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_SETFILE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +SETFILE=$ac_cv_path_SETFILE +if test -n "$SETFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5 +$as_echo "$SETFILE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$SETFILE" && break +done + + else + # The variable is set, but is it from the command line or the environment? + + # Try to remove the string !SETFILE! from our list. + try_remove_var=${CONFIGURE_OVERRIDDEN_VARIABLES//!SETFILE!/} + if test "x$try_remove_var" = "x$CONFIGURE_OVERRIDDEN_VARIABLES"; then + # If it failed, the variable was not from the command line. Ignore it, + # but warn the user (except for BASH, which is always set by the calling BASH). + if test "xSETFILE" != xBASH; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Ignoring value of SETFILE from the environment. Use command line variables instead." >&5 +$as_echo "$as_me: WARNING: Ignoring value of SETFILE from the environment. Use command line variables instead." >&2;} + fi + # Try to locate tool using the code snippet + for ac_prog in SetFile +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_SETFILE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $SETFILE in + [\\/]* | ?:[\\/]*) + ac_cv_path_SETFILE="$SETFILE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_SETFILE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +SETFILE=$ac_cv_path_SETFILE +if test -n "$SETFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5 +$as_echo "$SETFILE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$SETFILE" && break +done + + else + # If it succeeded, then it was overridden by the user. We will use it + # for the tool. + + # First remove it from the list of overridden variables, so we can test + # for unknown variables in the end. + CONFIGURE_OVERRIDDEN_VARIABLES="$try_remove_var" + + # Check if the provided tool contains a complete path. + tool_specified="$SETFILE" + tool_basename="${tool_specified##*/}" + if test "x$tool_basename" = "x$tool_specified"; then + # A command without a complete path is provided, search $PATH. + { $as_echo "$as_me:${as_lineno-$LINENO}: Will search for user supplied tool SETFILE=$tool_basename" >&5 +$as_echo "$as_me: Will search for user supplied tool SETFILE=$tool_basename" >&6;} + # Extract the first word of "$tool_basename", so it can be a program name with args. +set dummy $tool_basename; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_SETFILE+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $SETFILE in + [\\/]* | ?:[\\/]*) + ac_cv_path_SETFILE="$SETFILE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_SETFILE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +SETFILE=$ac_cv_path_SETFILE +if test -n "$SETFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5 +$as_echo "$SETFILE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "x$SETFILE" = x; then + as_fn_error $? "User supplied tool $tool_basename could not be found" "$LINENO" 5 + fi + else + # Otherwise we believe it is a complete path. Use it as it is. + { $as_echo "$as_me:${as_lineno-$LINENO}: Will use user supplied tool SETFILE=$tool_specified" >&5 +$as_echo "$as_me: Will use user supplied tool SETFILE=$tool_specified" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SETFILE" >&5 +$as_echo_n "checking for SETFILE... " >&6; } + if test ! -x "$tool_specified"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +$as_echo "not found" >&6; } + as_fn_error $? "User supplied tool SETFILE=$tool_specified does not exist or is not executable" "$LINENO" 5 + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $tool_specified" >&5 +$as_echo "$tool_specified" >&6; } + fi + fi + fi + + + + if test "x$SETFILE" = x; then + as_fn_error $? "Could not find required tool for SETFILE" "$LINENO" 5 + fi + + fi diff --git a/corba/.hgtags b/corba/.hgtags index 4c9c74c6bdb..009eac142d9 100644 --- a/corba/.hgtags +++ b/corba/.hgtags @@ -310,3 +310,5 @@ d27f7e0a7aca129969de23e9934408a31b4abf4c jdk9-b62 afc1e295c4bf83f9a5dd539c29914edd4a754a3f jdk9-b65 44ee68f7dbacab24a45115fd6a8ccdc7eb6e8f0b jdk9-b66 4418697e56f1f43597f55c7cb6573549c6117868 jdk9-b67 +8efad64f40eb8cd4df376c0a5275892eeb396bbd jdk9-b68 +de8acedcb5b5870f1dc54cba575aaa5d33897ea2 jdk9-b69 diff --git a/corba/src/java.corba/share/classes/org/omg/CORBA/BoundsHelper.java b/corba/src/java.corba/share/classes/org/omg/CORBA/BoundsHelper.java new file mode 100644 index 00000000000..54aae7c1df0 --- /dev/null +++ b/corba/src/java.corba/share/classes/org/omg/CORBA/BoundsHelper.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package org.omg.CORBA; + + +/** + * This Helper class is used to facilitate the marshalling of Bounds. + * For more information on Helper files, see + * + * "Generated Files: Helper Files".

+ */ + +abstract public class BoundsHelper +{ + private static String _id = "IDL:omg.org/CORBA/Bounds:1.0"; + + public static void insert (org.omg.CORBA.Any a, org.omg.CORBA.Bounds that) + { + org.omg.CORBA.portable.OutputStream out = a.create_output_stream (); + a.type (type ()); + write (out, that); + a.read_value (out.create_input_stream (), type ()); + } + + public static org.omg.CORBA.Bounds extract (org.omg.CORBA.Any a) + { + return read (a.create_input_stream ()); + } + + private static org.omg.CORBA.TypeCode __typeCode = null; + private static boolean __active = false; + synchronized public static org.omg.CORBA.TypeCode type () + { + if (__typeCode == null) + { + synchronized (org.omg.CORBA.TypeCode.class) + { + if (__typeCode == null) + { + if (__active) + { + return org.omg.CORBA.ORB.init().create_recursive_tc ( _id ); + } + __active = true; + org.omg.CORBA.StructMember[] _members0 = new org.omg.CORBA.StructMember [0]; + org.omg.CORBA.TypeCode _tcOf_members0 = null; + __typeCode = org.omg.CORBA.ORB.init ().create_exception_tc (org.omg.CORBA.BoundsHelper.id (), "Bounds", _members0); + __active = false; + } + } + } + return __typeCode; + } + + public static String id () + { + return _id; + } + + public static org.omg.CORBA.Bounds read (org.omg.CORBA.portable.InputStream istream) + { + org.omg.CORBA.Bounds value = new org.omg.CORBA.Bounds (); + // read and discard the repository ID + istream.read_string (); + return value; + } + + public static void write (org.omg.CORBA.portable.OutputStream ostream, org.omg.CORBA.Bounds value) + { + // write the repository ID + ostream.write_string (id ()); + } + +} diff --git a/corba/src/java.corba/share/classes/org/omg/CORBA/DynAny.java b/corba/src/java.corba/share/classes/org/omg/CORBA/DynAny.java index 8024a6d8ea6..5d0af777e54 100644 --- a/corba/src/java.corba/share/classes/org/omg/CORBA/DynAny.java +++ b/corba/src/java.corba/share/classes/org/omg/CORBA/DynAny.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,8 +52,8 @@ public interface DynAny extends org.omg.CORBA.Object * * @param dyn_any the DynAny object whose contents * are assigned to this DynAny. - * @throws Invalid if the source DynAny is - * invalid + * @throws org.omg.CORBA.DynAnyPackage.Invalid if the source + * DynAny is invalid */ public void assign(org.omg.CORBA.DynAny dyn_any) throws org.omg.CORBA.DynAnyPackage.Invalid; @@ -63,8 +63,8 @@ public interface DynAny extends org.omg.CORBA.Object * object. * * @param value the Any object. - * @throws Invalid if the source Any object is - * empty or bad + * @throws org.omg.CORBA.DynAnyPackage.Invalid if the source + * Any object is empty or bad */ public void from_any(org.omg.CORBA.Any value) throws org.omg.CORBA.DynAnyPackage.Invalid; @@ -74,8 +74,8 @@ public interface DynAny extends org.omg.CORBA.Object * object. * * @return the Any object. - * @throws Invalid if this DynAny is empty or - * bad. + * @throws org.omg.CORBA.DynAnyPackage.Invalid if this + * DynAny is empty or bad. * created or does not contain a meaningful value */ public org.omg.CORBA.Any to_any() diff --git a/corba/src/java.corba/share/classes/org/omg/CORBA/DynArray.java b/corba/src/java.corba/share/classes/org/omg/CORBA/DynArray.java index 7018090693b..14559e4a681 100644 --- a/corba/src/java.corba/share/classes/org/omg/CORBA/DynArray.java +++ b/corba/src/java.corba/share/classes/org/omg/CORBA/DynArray.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -48,7 +48,8 @@ public interface DynArray extends org.omg.CORBA.Object, org.omg.CORBA.DynAny * DynArray object to the given array. * * @param value the array of Any objects - * @exception InvalidSeq if the sequence is bad + * @exception org.omg.CORBA.DynAnyPackage.InvalidSeq if the + * sequence is bad * @see #get_elements */ public void set_elements(org.omg.CORBA.Any[] value) diff --git a/corba/src/java.corba/share/classes/org/omg/CORBA/DynSequence.java b/corba/src/java.corba/share/classes/org/omg/CORBA/DynSequence.java index 3bbcc0555c9..c5361834c75 100644 --- a/corba/src/java.corba/share/classes/org/omg/CORBA/DynSequence.java +++ b/corba/src/java.corba/share/classes/org/omg/CORBA/DynSequence.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,7 +65,8 @@ public interface DynSequence extends org.omg.CORBA.Object, org.omg.CORBA.DynAny * array. * * @param value the array of Any objects to be set - * @exception InvalidSeq if the array of values is bad + * @exception org.omg.CORBA.DynAnyPackage.InvalidSeq if the array + * of values is bad * @see #get_elements */ public void set_elements(org.omg.CORBA.Any[] value) diff --git a/corba/src/java.corba/share/classes/org/omg/CORBA/ORBPackage/InvalidNameHelper.java b/corba/src/java.corba/share/classes/org/omg/CORBA/ORBPackage/InvalidNameHelper.java new file mode 100644 index 00000000000..044e2b17eb4 --- /dev/null +++ b/corba/src/java.corba/share/classes/org/omg/CORBA/ORBPackage/InvalidNameHelper.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package org.omg.CORBA.ORBPackage; + + +/** + * This Helper class is used to facilitate the marshalling of + * ORBPackage/InvalidName. + * For more information on Helper files, see + * + * "Generated Files: Helper Files".

+ */ + +abstract public class InvalidNameHelper +{ + private static String _id = "IDL:omg.org.CORBA/ORB/InvalidName:1.0"; + + public static void insert (org.omg.CORBA.Any a, org.omg.CORBA.ORBPackage.InvalidName that) + { + org.omg.CORBA.portable.OutputStream out = a.create_output_stream (); + a.type (type ()); + write (out, that); + a.read_value (out.create_input_stream (), type ()); + } + + public static org.omg.CORBA.ORBPackage.InvalidName extract (org.omg.CORBA.Any a) + { + return read (a.create_input_stream ()); + } + + private static org.omg.CORBA.TypeCode __typeCode = null; + private static boolean __active = false; + synchronized public static org.omg.CORBA.TypeCode type () + { + if (__typeCode == null) + { + synchronized (org.omg.CORBA.TypeCode.class) + { + if (__typeCode == null) + { + if (__active) + { + return org.omg.CORBA.ORB.init().create_recursive_tc ( _id ); + } + __active = true; + org.omg.CORBA.StructMember[] _members0 = new org.omg.CORBA.StructMember [0]; + org.omg.CORBA.TypeCode _tcOf_members0 = null; + __typeCode = org.omg.CORBA.ORB.init ().create_exception_tc (org.omg.CORBA.ORBPackage.InvalidNameHelper.id (), "InvalidName", _members0); + __active = false; + } + } + } + return __typeCode; + } + + public static String id () + { + return _id; + } + + public static org.omg.CORBA.ORBPackage.InvalidName read (org.omg.CORBA.portable.InputStream istream) + { + org.omg.CORBA.ORBPackage.InvalidName value = new org.omg.CORBA.ORBPackage.InvalidName (); + // read and discard the repository ID + istream.read_string (); + return value; + } + + public static void write (org.omg.CORBA.portable.OutputStream ostream, org.omg.CORBA.ORBPackage.InvalidName value) + { + // write the repository ID + ostream.write_string (id ()); + } + +} diff --git a/corba/src/java.corba/share/classes/org/omg/CORBA/ServerRequest.java b/corba/src/java.corba/share/classes/org/omg/CORBA/ServerRequest.java index f4f5ed264ae..04cdeb6ffde 100644 --- a/corba/src/java.corba/share/classes/org/omg/CORBA/ServerRequest.java +++ b/corba/src/java.corba/share/classes/org/omg/CORBA/ServerRequest.java @@ -248,7 +248,7 @@ public abstract class ServerRequest { * contain an exception will result in a BAD_PARAM system exception. Passing * in an unlisted user exception will result in either the DIR receiving a * BAD_PARAM system exception or in the client receiving an - * UNKNOWN_EXCEPTION system exception. + * UNKNOWN system exception. * * @param any the Any object containing the exception * @deprecated use set_exception() @@ -272,13 +272,13 @@ public abstract class ServerRequest { * will cause a BAD_PARAM system exception to be thrown. Passing * in an unlisted user exception will result in either the DIR receiving a * BAD_PARAM system exception or in the client receiving an - * UNKNOWN_EXCEPTION system exception. + * UNKNOWN system exception. * * @param any the Any object containing the exception * @exception BAD_PARAM if the given Any object does not * contain an exception or the exception is an * unlisted user exception - * @exception UNKNOWN_EXCEPTION if the given exception is an unlisted + * @exception UNKNOWN if the given exception is an unlisted * user exception and the DIR did not * receive a BAD_PARAM exception * @see CORBA diff --git a/corba/src/java.corba/share/classes/org/omg/CORBA/TypeCodePackage/BadKindHelper.java b/corba/src/java.corba/share/classes/org/omg/CORBA/TypeCodePackage/BadKindHelper.java new file mode 100644 index 00000000000..755935698dd --- /dev/null +++ b/corba/src/java.corba/share/classes/org/omg/CORBA/TypeCodePackage/BadKindHelper.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package org.omg.CORBA.TypeCodePackage; + + +/** + * This Helper class is used to facilitate the marshalling of + * TypeCodePackage/BadKind. + * For more information on Helper files, see + * + * "Generated Files: Helper Files".

+ */ + +abstract public class BadKindHelper +{ + private static String _id = "IDL:omg.org.CORBA/TypeCode/BadKind:1.0"; + + public static void insert (org.omg.CORBA.Any a, org.omg.CORBA.TypeCodePackage.BadKind that) + { + org.omg.CORBA.portable.OutputStream out = a.create_output_stream (); + a.type (type ()); + write (out, that); + a.read_value (out.create_input_stream (), type ()); + } + + public static org.omg.CORBA.TypeCodePackage.BadKind extract (org.omg.CORBA.Any a) + { + return read (a.create_input_stream ()); + } + + private static org.omg.CORBA.TypeCode __typeCode = null; + private static boolean __active = false; + synchronized public static org.omg.CORBA.TypeCode type () + { + if (__typeCode == null) + { + synchronized (org.omg.CORBA.TypeCode.class) + { + if (__typeCode == null) + { + if (__active) + { + return org.omg.CORBA.ORB.init().create_recursive_tc ( _id ); + } + __active = true; + org.omg.CORBA.StructMember[] _members0 = new org.omg.CORBA.StructMember [0]; + org.omg.CORBA.TypeCode _tcOf_members0 = null; + __typeCode = org.omg.CORBA.ORB.init ().create_exception_tc (org.omg.CORBA.TypeCodePackage.BadKindHelper.id (), "BadKind", _members0); + __active = false; + } + } + } + return __typeCode; + } + + public static String id () + { + return _id; + } + + public static org.omg.CORBA.TypeCodePackage.BadKind read (org.omg.CORBA.portable.InputStream istream) + { + org.omg.CORBA.TypeCodePackage.BadKind value = new org.omg.CORBA.TypeCodePackage.BadKind (); + // read and discard the repository ID + istream.read_string (); + return value; + } + + public static void write (org.omg.CORBA.portable.OutputStream ostream, org.omg.CORBA.TypeCodePackage.BadKind value) + { + // write the repository ID + ostream.write_string (id ()); + } + +} diff --git a/corba/src/java.corba/share/classes/org/omg/CORBA/TypeCodePackage/BoundsHelper.java b/corba/src/java.corba/share/classes/org/omg/CORBA/TypeCodePackage/BoundsHelper.java new file mode 100644 index 00000000000..c234c595b17 --- /dev/null +++ b/corba/src/java.corba/share/classes/org/omg/CORBA/TypeCodePackage/BoundsHelper.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package org.omg.CORBA.TypeCodePackage; + + +/** + * This Helper class is used to facilitate the marshalling of + * TypeCodePackage/Bounds. + * For more information on Helper files, see + * + * "Generated Files: Helper Files".

+ */ + +abstract public class BoundsHelper +{ + private static String _id = "IDL:omg.org.CORBA/TypeCode/Bounds:1.0"; + + public static void insert (org.omg.CORBA.Any a, org.omg.CORBA.TypeCodePackage.Bounds that) + { + org.omg.CORBA.portable.OutputStream out = a.create_output_stream (); + a.type (type ()); + write (out, that); + a.read_value (out.create_input_stream (), type ()); + } + + public static org.omg.CORBA.TypeCodePackage.Bounds extract (org.omg.CORBA.Any a) + { + return read (a.create_input_stream ()); + } + + private static org.omg.CORBA.TypeCode __typeCode = null; + private static boolean __active = false; + synchronized public static org.omg.CORBA.TypeCode type () + { + if (__typeCode == null) + { + synchronized (org.omg.CORBA.TypeCode.class) + { + if (__typeCode == null) + { + if (__active) + { + return org.omg.CORBA.ORB.init().create_recursive_tc ( _id ); + } + __active = true; + org.omg.CORBA.StructMember[] _members0 = new org.omg.CORBA.StructMember [0]; + org.omg.CORBA.TypeCode _tcOf_members0 = null; + __typeCode = org.omg.CORBA.ORB.init ().create_exception_tc (org.omg.CORBA.TypeCodePackage.BoundsHelper.id (), "Bounds", _members0); + __active = false; + } + } + } + return __typeCode; + } + + public static String id () + { + return _id; + } + + public static org.omg.CORBA.TypeCodePackage.Bounds read (org.omg.CORBA.portable.InputStream istream) + { + org.omg.CORBA.TypeCodePackage.Bounds value = new org.omg.CORBA.TypeCodePackage.Bounds (); + // read and discard the repository ID + istream.read_string (); + return value; + } + + public static void write (org.omg.CORBA.portable.OutputStream ostream, org.omg.CORBA.TypeCodePackage.Bounds value) + { + // write the repository ID + ostream.write_string (id ()); + } + +} diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 57051d33f64..c13907dcf7d 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -470,3 +470,5 @@ bf92b8db249cdfa5651ef954b6c0743a7e0ea4cd jdk9-b64 e7ae94c4f35e940ea423fc1dd260435df34a77c0 jdk9-b65 197e94e0dacddd16816f101d24fc0442ab518326 jdk9-b66 d47dfabd16d48eb96a451edd1b61194a39ee0eb5 jdk9-b67 +11af3990d56c97b40318bc1f20608e86f051a3f7 jdk9-b68 +ff0929a59ced0e144201aa05819ae2e47d6f2c61 jdk9-b69 diff --git a/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp b/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp index 1b535aa0f9d..729cec8fe01 100644 --- a/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp +++ b/hotspot/src/cpu/aarch64/vm/vm_version_aarch64.cpp @@ -228,6 +228,9 @@ void VM_Version::get_processor_features() { warning("SHA512 instruction (for SHA-384 and SHA-512) is not available on this CPU."); FLAG_SET_DEFAULT(UseSHA512Intrinsics, false); } + if (!(UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics)) { + FLAG_SET_DEFAULT(UseSHA, false); + } } // This machine allows unaligned memory accesses diff --git a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp index 3e388568342..08c46153e5f 100644 --- a/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp +++ b/hotspot/src/os_cpu/linux_zero/vm/os_linux_zero.cpp @@ -59,8 +59,8 @@ extern sigjmp_buf* get_jmp_buf_for_continuation(); address os::current_stack_pointer() { - address dummy = (address) &dummy; - return dummy; + // return the address of the current function + return (address)__builtin_frame_address(0); } frame os::get_sender_for_C_frame(frame* fr) { diff --git a/hotspot/src/share/vm/ci/ciMethod.cpp b/hotspot/src/share/vm/ci/ciMethod.cpp index 81ef4bf37df..101056794c6 100644 --- a/hotspot/src/share/vm/ci/ciMethod.cpp +++ b/hotspot/src/share/vm/ci/ciMethod.cpp @@ -71,8 +71,7 @@ // Loaded method. ciMethod::ciMethod(methodHandle h_m, ciInstanceKlass* holder) : ciMetadata(h_m()), - _holder(holder), - _has_injected_profile(false) + _holder(holder) { assert(h_m() != NULL, "no null method"); @@ -170,8 +169,7 @@ ciMethod::ciMethod(ciInstanceKlass* holder, _liveness( NULL), _can_be_statically_bound(false), _method_blocks( NULL), - _method_data( NULL), - _has_injected_profile( false) + _method_data( NULL) #if defined(COMPILER2) || defined(SHARK) , _flow( NULL), diff --git a/hotspot/src/share/vm/ci/ciMethod.hpp b/hotspot/src/share/vm/ci/ciMethod.hpp index ead6a962589..c394ea29310 100644 --- a/hotspot/src/share/vm/ci/ciMethod.hpp +++ b/hotspot/src/share/vm/ci/ciMethod.hpp @@ -81,7 +81,6 @@ class ciMethod : public ciMetadata { bool _is_c1_compilable; bool _is_c2_compilable; bool _can_be_statically_bound; - bool _has_injected_profile; // Lazy fields, filled in on demand address _code; @@ -179,9 +178,9 @@ class ciMethod : public ciMetadata { // Code size for inlining decisions. int code_size_for_inlining(); - bool caller_sensitive() { return get_Method()->caller_sensitive(); } - bool force_inline() { return get_Method()->force_inline(); } - bool dont_inline() { return get_Method()->dont_inline(); } + bool caller_sensitive() const { return get_Method()->caller_sensitive(); } + bool force_inline() const { return get_Method()->force_inline(); } + bool dont_inline() const { return get_Method()->dont_inline(); } int comp_level(); int highest_osr_comp_level(); @@ -289,9 +288,6 @@ class ciMethod : public ciMetadata { int instructions_size(); int scale_count(int count, float prof_factor = 1.); // make MDO count commensurate with IIC - bool has_injected_profile() const { return _has_injected_profile; } - void set_injected_profile(bool x) { _has_injected_profile = x; } - // Stack walking support bool is_ignored_by_security_stack_walk() const; diff --git a/hotspot/src/share/vm/classfile/classFileParser.cpp b/hotspot/src/share/vm/classfile/classFileParser.cpp index 03de5b4c653..1d76a95622b 100644 --- a/hotspot/src/share/vm/classfile/classFileParser.cpp +++ b/hotspot/src/share/vm/classfile/classFileParser.cpp @@ -1739,6 +1739,10 @@ ClassFileParser::AnnotationCollector::annotation_index(ClassLoaderData* loader_d if (_location != _in_method) break; // only allow for methods if (!privileged) break; // only allow in privileged code return _method_DontInline; + case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_InjectedProfile_signature): + if (_location != _in_method) break; // only allow for methods + if (!privileged) break; // only allow in privileged code + return _method_InjectedProfile; case vmSymbols::VM_SYMBOL_ENUM_NAME(java_lang_invoke_LambdaForm_Compiled_signature): if (_location != _in_method) break; // only allow for methods if (!privileged) break; // only allow in privileged code @@ -1780,6 +1784,8 @@ void ClassFileParser::MethodAnnotationCollector::apply_to(methodHandle m) { m->set_force_inline(true); if (has_annotation(_method_DontInline)) m->set_dont_inline(true); + if (has_annotation(_method_InjectedProfile)) + m->set_has_injected_profile(true); if (has_annotation(_method_LambdaForm_Compiled) && m->intrinsic_id() == vmIntrinsics::_none) m->set_intrinsic_id(vmIntrinsics::_compiledLambdaForm); if (has_annotation(_method_LambdaForm_Hidden)) diff --git a/hotspot/src/share/vm/classfile/classFileParser.hpp b/hotspot/src/share/vm/classfile/classFileParser.hpp index 3187cfbc610..6d8c180954c 100644 --- a/hotspot/src/share/vm/classfile/classFileParser.hpp +++ b/hotspot/src/share/vm/classfile/classFileParser.hpp @@ -127,6 +127,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC { _method_CallerSensitive, _method_ForceInline, _method_DontInline, + _method_InjectedProfile, _method_LambdaForm_Compiled, _method_LambdaForm_Hidden, _sun_misc_Contended, diff --git a/hotspot/src/share/vm/classfile/vmSymbols.hpp b/hotspot/src/share/vm/classfile/vmSymbols.hpp index d2a85e84492..bd5f9285e7c 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp @@ -278,6 +278,7 @@ template(java_lang_invoke_LambdaForm, "java/lang/invoke/LambdaForm") \ template(java_lang_invoke_ForceInline_signature, "Ljava/lang/invoke/ForceInline;") \ template(java_lang_invoke_DontInline_signature, "Ljava/lang/invoke/DontInline;") \ + template(java_lang_invoke_InjectedProfile_signature, "Ljava/lang/invoke/InjectedProfile;") \ template(java_lang_invoke_Stable_signature, "Ljava/lang/invoke/Stable;") \ template(java_lang_invoke_LambdaForm_Compiled_signature, "Ljava/lang/invoke/LambdaForm$Compiled;") \ template(java_lang_invoke_LambdaForm_Hidden_signature, "Ljava/lang/invoke/LambdaForm$Hidden;") \ diff --git a/hotspot/src/share/vm/oops/method.cpp b/hotspot/src/share/vm/oops/method.cpp index b40e347405e..9746ac3bed3 100644 --- a/hotspot/src/share/vm/oops/method.cpp +++ b/hotspot/src/share/vm/oops/method.cpp @@ -93,6 +93,7 @@ Method::Method(ConstMethod* xconst, AccessFlags access_flags, int size) { set_force_inline(false); set_hidden(false); set_dont_inline(false); + set_has_injected_profile(false); set_method_data(NULL); clear_method_counters(); set_vtable_index(Method::garbage_vtable_index); diff --git a/hotspot/src/share/vm/oops/method.hpp b/hotspot/src/share/vm/oops/method.hpp index d87864a7704..cf2bc9214b5 100644 --- a/hotspot/src/share/vm/oops/method.hpp +++ b/hotspot/src/share/vm/oops/method.hpp @@ -76,12 +76,13 @@ class Method : public Metadata { // Flags enum Flags { - _jfr_towrite = 1 << 0, - _caller_sensitive = 1 << 1, - _force_inline = 1 << 2, - _dont_inline = 1 << 3, - _hidden = 1 << 4, - _running_emcp = 1 << 5 + _jfr_towrite = 1 << 0, + _caller_sensitive = 1 << 1, + _force_inline = 1 << 2, + _dont_inline = 1 << 3, + _hidden = 1 << 4, + _has_injected_profile = 1 << 5, + _running_emcp = 1 << 6 }; u1 _flags; @@ -814,6 +815,13 @@ class Method : public Metadata { _flags = x ? (_flags | _hidden) : (_flags & ~_hidden); } + bool has_injected_profile() { + return (_flags & _has_injected_profile) != 0; + } + void set_has_injected_profile(bool x) { + _flags = x ? (_flags | _has_injected_profile) : (_flags & ~_has_injected_profile); + } + ConstMethod::MethodType method_type() const { return _constMethod->method_type(); } diff --git a/hotspot/src/share/vm/opto/arraycopynode.cpp b/hotspot/src/share/vm/opto/arraycopynode.cpp index 64233d49722..b09cecc8760 100644 --- a/hotspot/src/share/vm/opto/arraycopynode.cpp +++ b/hotspot/src/share/vm/opto/arraycopynode.cpp @@ -438,11 +438,17 @@ bool ArrayCopyNode::finish_transform(PhaseGVN *phase, bool can_reshape, // replace fallthrough projections of the ArrayCopyNode by the // new memory, control and the input IO. CallProjections callprojs; - extract_projections(&callprojs, true); + extract_projections(&callprojs, true, false); - igvn->replace_node(callprojs.fallthrough_ioproj, in(TypeFunc::I_O)); - igvn->replace_node(callprojs.fallthrough_memproj, mem); - igvn->replace_node(callprojs.fallthrough_catchproj, ctl); + if (callprojs.fallthrough_ioproj != NULL) { + igvn->replace_node(callprojs.fallthrough_ioproj, in(TypeFunc::I_O)); + } + if (callprojs.fallthrough_memproj != NULL) { + igvn->replace_node(callprojs.fallthrough_memproj, mem); + } + if (callprojs.fallthrough_catchproj != NULL) { + igvn->replace_node(callprojs.fallthrough_catchproj, ctl); + } // The ArrayCopyNode is not disconnected. It still has the // projections for the exception case. Replace current diff --git a/hotspot/src/share/vm/opto/callnode.cpp b/hotspot/src/share/vm/opto/callnode.cpp index 7a4eeb0939a..b25a9945009 100644 --- a/hotspot/src/share/vm/opto/callnode.cpp +++ b/hotspot/src/share/vm/opto/callnode.cpp @@ -724,6 +724,26 @@ uint CallNode::match_edge(uint idx) const { // bool CallNode::may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase) { assert((t_oop != NULL), "sanity"); + if (is_call_to_arraycopystub()) { + const TypeTuple* args = _tf->domain(); + Node* dest = NULL; + // Stubs that can be called once an ArrayCopyNode is expanded have + // different signatures. Look for the second pointer argument, + // that is the destination of the copy. + for (uint i = TypeFunc::Parms, j = 0; i < args->cnt(); i++) { + if (args->field_at(i)->isa_ptr()) { + j++; + if (j == 2) { + dest = in(i); + break; + } + } + } + if (!dest->is_top() && may_modify_arraycopy_helper(phase->type(dest)->is_oopptr(), t_oop, phase)) { + return true; + } + return false; + } if (t_oop->is_known_instance()) { // The instance_id is set only for scalar-replaceable allocations which // are not passed as arguments according to Escape Analysis. @@ -810,7 +830,7 @@ Node *CallNode::result_cast() { } -void CallNode::extract_projections(CallProjections* projs, bool separate_io_proj) { +void CallNode::extract_projections(CallProjections* projs, bool separate_io_proj, bool do_asserts) { projs->fallthrough_proj = NULL; projs->fallthrough_catchproj = NULL; projs->fallthrough_ioproj = NULL; @@ -873,17 +893,18 @@ void CallNode::extract_projections(CallProjections* projs, bool separate_io_proj } } - // The resproj may not exist because the result couuld be ignored + // The resproj may not exist because the result could be ignored // and the exception object may not exist if an exception handler // swallows the exception but all the other must exist and be found. assert(projs->fallthrough_proj != NULL, "must be found"); - assert(Compile::current()->inlining_incrementally() || projs->fallthrough_catchproj != NULL, "must be found"); - assert(Compile::current()->inlining_incrementally() || projs->fallthrough_memproj != NULL, "must be found"); - assert(Compile::current()->inlining_incrementally() || projs->fallthrough_ioproj != NULL, "must be found"); - assert(Compile::current()->inlining_incrementally() || projs->catchall_catchproj != NULL, "must be found"); + do_asserts = do_asserts && !Compile::current()->inlining_incrementally(); + assert(!do_asserts || projs->fallthrough_catchproj != NULL, "must be found"); + assert(!do_asserts || projs->fallthrough_memproj != NULL, "must be found"); + assert(!do_asserts || projs->fallthrough_ioproj != NULL, "must be found"); + assert(!do_asserts || projs->catchall_catchproj != NULL, "must be found"); if (separate_io_proj) { - assert(Compile::current()->inlining_incrementally() || projs->catchall_memproj != NULL, "must be found"); - assert(Compile::current()->inlining_incrementally() || projs->catchall_ioproj != NULL, "must be found"); + assert(!do_asserts || projs->catchall_memproj != NULL, "must be found"); + assert(!do_asserts || projs->catchall_ioproj != NULL, "must be found"); } } @@ -909,6 +930,12 @@ Node *CallNode::Ideal(PhaseGVN *phase, bool can_reshape) { return SafePointNode::Ideal(phase, can_reshape); } +bool CallNode::is_call_to_arraycopystub() const { + if (_name != NULL && strstr(_name, "arraycopy") != 0) { + return true; + } + return false; +} //============================================================================= uint CallJavaNode::size_of() const { return sizeof(*this); } @@ -1007,14 +1034,6 @@ void CallRuntimeNode::calling_convention( BasicType* sig_bt, VMRegPair *parm_reg //============================================================================= -bool CallLeafNode::is_call_to_arraycopystub() const { - if (_name != NULL && strstr(_name, "arraycopy") != 0) { - return true; - } - return false; -} - - #ifndef PRODUCT void CallLeafNode::dump_spec(outputStream *st) const { st->print("# "); @@ -1930,26 +1949,3 @@ bool CallNode::may_modify_arraycopy_helper(const TypeOopPtr* dest_t, const TypeO return true; } -bool CallLeafNode::may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase) { - if (is_call_to_arraycopystub()) { - const TypeTuple* args = _tf->domain(); - Node* dest = NULL; - // Stubs that can be called once an ArrayCopyNode is expanded have - // different signatures. Look for the second pointer argument, - // that is the destination of the copy. - for (uint i = TypeFunc::Parms, j = 0; i < args->cnt(); i++) { - if (args->field_at(i)->isa_ptr()) { - j++; - if (j == 2) { - dest = in(i); - break; - } - } - } - if (!dest->is_top() && may_modify_arraycopy_helper(phase->type(dest)->is_oopptr(), t_oop, phase)) { - return true; - } - return false; - } - return CallNode::may_modify(t_oop, phase); -} diff --git a/hotspot/src/share/vm/opto/callnode.hpp b/hotspot/src/share/vm/opto/callnode.hpp index 4eaaaebe0a6..990962188e5 100644 --- a/hotspot/src/share/vm/opto/callnode.hpp +++ b/hotspot/src/share/vm/opto/callnode.hpp @@ -565,13 +565,15 @@ public: address _entry_point; // Address of method being called float _cnt; // Estimate of number of times called CallGenerator* _generator; // corresponding CallGenerator for some late inline calls + const char *_name; // Printable name, if _method is NULL CallNode(const TypeFunc* tf, address addr, const TypePtr* adr_type) : SafePointNode(tf->domain()->cnt(), NULL, adr_type), _tf(tf), _entry_point(addr), _cnt(COUNT_UNKNOWN), - _generator(NULL) + _generator(NULL), + _name(NULL) { init_class_id(Class_Call); } @@ -626,10 +628,12 @@ public: // Collect all the interesting edges from a call for use in // replacing the call by something else. Used by macro expansion // and the late inlining support. - void extract_projections(CallProjections* projs, bool separate_io_proj); + void extract_projections(CallProjections* projs, bool separate_io_proj, bool do_asserts = true); virtual uint match_edge(uint idx) const; + bool is_call_to_arraycopystub() const; + #ifndef PRODUCT virtual void dump_req(outputStream *st = tty) const; virtual void dump_spec(outputStream *st) const; @@ -683,7 +687,7 @@ class CallStaticJavaNode : public CallJavaNode { virtual uint size_of() const; // Size is bigger public: CallStaticJavaNode(Compile* C, const TypeFunc* tf, address addr, ciMethod* method, int bci) - : CallJavaNode(tf, addr, method, bci), _name(NULL) { + : CallJavaNode(tf, addr, method, bci) { init_class_id(Class_CallStaticJava); if (C->eliminate_boxing() && (method != NULL) && method->is_boxing_method()) { init_flags(Flag_is_macro); @@ -694,14 +698,14 @@ public: } CallStaticJavaNode(const TypeFunc* tf, address addr, const char* name, int bci, const TypePtr* adr_type) - : CallJavaNode(tf, addr, NULL, bci), _name(name) { + : CallJavaNode(tf, addr, NULL, bci) { init_class_id(Class_CallStaticJava); // This node calls a runtime stub, which often has narrow memory effects. _adr_type = adr_type; _is_scalar_replaceable = false; _is_non_escaping = false; + _name = name; } - const char *_name; // Runtime wrapper name // Result of Escape Analysis bool _is_scalar_replaceable; @@ -754,13 +758,12 @@ class CallRuntimeNode : public CallNode { public: CallRuntimeNode(const TypeFunc* tf, address addr, const char* name, const TypePtr* adr_type) - : CallNode(tf, addr, adr_type), - _name(name) + : CallNode(tf, addr, adr_type) { init_class_id(Class_CallRuntime); + _name = name; } - const char *_name; // Printable name, if _method is NULL virtual int Opcode() const; virtual void calling_convention( BasicType* sig_bt, VMRegPair *parm_regs, uint argcnt ) const; @@ -785,8 +788,6 @@ public: #ifndef PRODUCT virtual void dump_spec(outputStream *st) const; #endif - bool is_call_to_arraycopystub() const; - virtual bool may_modify(const TypeOopPtr *t_oop, PhaseTransform *phase); }; //------------------------------CallLeafNoFPNode------------------------------- diff --git a/hotspot/src/share/vm/opto/compile.cpp b/hotspot/src/share/vm/opto/compile.cpp index 325605cd8be..5025d8360a6 100644 --- a/hotspot/src/share/vm/opto/compile.cpp +++ b/hotspot/src/share/vm/opto/compile.cpp @@ -3390,9 +3390,6 @@ bool Compile::final_graph_reshaping() { bool Compile::too_many_traps(ciMethod* method, int bci, Deoptimization::DeoptReason reason) { - if (method->has_injected_profile()) { - return false; - } ciMethodData* md = method->method_data(); if (md->is_empty()) { // Assume the trap has not occurred, or that it occurred only @@ -3442,9 +3439,6 @@ bool Compile::too_many_traps(Deoptimization::DeoptReason reason, bool Compile::too_many_recompiles(ciMethod* method, int bci, Deoptimization::DeoptReason reason) { - if (method->has_injected_profile()) { - return false; - } ciMethodData* md = method->method_data(); if (md->is_empty()) { // Assume the trap has not occurred, or that it occurred only diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp index 83a1673aa74..bea8625e954 100644 --- a/hotspot/src/share/vm/opto/library_call.cpp +++ b/hotspot/src/share/vm/opto/library_call.cpp @@ -6125,8 +6125,6 @@ bool LibraryCallKit::inline_profileBoolean() { jint false_cnt = aobj->element_value(0).as_int(); jint true_cnt = aobj->element_value(1).as_int(); - method()->set_injected_profile(true); - if (C->log() != NULL) { C->log()->elem("observe source='profileBoolean' false='%d' true='%d'", false_cnt, true_cnt); diff --git a/hotspot/src/share/vm/opto/memnode.cpp b/hotspot/src/share/vm/opto/memnode.cpp index 09438ea03f8..3bee3f162b8 100644 --- a/hotspot/src/share/vm/opto/memnode.cpp +++ b/hotspot/src/share/vm/opto/memnode.cpp @@ -108,11 +108,10 @@ extern void print_alias_types(); #endif -static bool membar_for_arraycopy_helper(const TypeOopPtr *t_oop, MergeMemNode* mm, PhaseTransform *phase) { - if (mm->memory_at(Compile::AliasIdxRaw)->is_Proj()) { - Node* n = mm->memory_at(Compile::AliasIdxRaw)->in(0); - if ((n->is_ArrayCopy() && n->as_ArrayCopy()->may_modify(t_oop, phase)) || - (n->is_CallLeaf() && n->as_CallLeaf()->may_modify(t_oop, phase))) { +static bool membar_for_arraycopy_helper(const TypeOopPtr *t_oop, Node* n, PhaseTransform *phase) { + if (n->is_Proj()) { + n = n->in(0); + if (n->is_Call() && n->as_Call()->may_modify(t_oop, phase)) { return true; } } @@ -121,16 +120,22 @@ static bool membar_for_arraycopy_helper(const TypeOopPtr *t_oop, MergeMemNode* m static bool membar_for_arraycopy(const TypeOopPtr *t_oop, MemBarNode* mb, PhaseTransform *phase) { Node* mem = mb->in(TypeFunc::Memory); + if (mem->is_MergeMem()) { - return membar_for_arraycopy_helper(t_oop, mem->as_MergeMem(), phase); - } else if (mem->is_Phi()) { - // after macro expansion of an ArrayCopyNode we may have a Phi - for (uint i = 1; i < mem->req(); i++) { - if (mem->in(i) != NULL && mem->in(i)->is_MergeMem() && membar_for_arraycopy_helper(t_oop, mem->in(i)->as_MergeMem(), phase)) { - return true; + Node* n = mem->as_MergeMem()->memory_at(Compile::AliasIdxRaw); + if (membar_for_arraycopy_helper(t_oop, n, phase)) { + return true; + } else if (n->is_Phi()) { + for (uint i = 1; i < n->req(); i++) { + if (n->in(i) != NULL) { + if (membar_for_arraycopy_helper(t_oop, n->in(i), phase)) { + return true; + } + } } } } + return false; } diff --git a/hotspot/src/share/vm/runtime/deoptimization.cpp b/hotspot/src/share/vm/runtime/deoptimization.cpp index 79518448b5e..8dac5a6ee0a 100644 --- a/hotspot/src/share/vm/runtime/deoptimization.cpp +++ b/hotspot/src/share/vm/runtime/deoptimization.cpp @@ -1460,7 +1460,11 @@ JRT_ENTRY(void, Deoptimization::uncommon_trap_inner(JavaThread* thread, jint tra // // The other actions cause immediate removal of the present code. - bool update_trap_state = (reason != Reason_tenured); + // Traps caused by injected profile shouldn't pollute trap counts. + bool injected_profile_trap = trap_method->has_injected_profile() && + (reason == Reason_intrinsic || reason == Reason_unreached); + + bool update_trap_state = (reason != Reason_tenured) && !injected_profile_trap; bool make_not_entrant = false; bool make_not_compilable = false; bool reprofile = false; diff --git a/hotspot/test/compiler/arraycopy/TestLoadBypassArrayCopy.java b/hotspot/test/compiler/arraycopy/TestLoadBypassArrayCopy.java new file mode 100644 index 00000000000..697b9743b71 --- /dev/null +++ b/hotspot/test/compiler/arraycopy/TestLoadBypassArrayCopy.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact 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 8086046 + * @summary load bypasses arraycopy that sets the value after the ArrayCopyNode is expanded + * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement -XX:CompileCommand=dontinline,TestLoadBypassArrayCopy::test_helper -XX:-TieredCompilation TestLoadBypassArrayCopy + * + */ + +public class TestLoadBypassArrayCopy { + + static long i; + static boolean test_helper() { + i++; + if ((i%10) == 0) { + return false; + } + return true; + } + + static int test(int[] src, int len, boolean flag) { + int[] dest = new int[10]; + int res = 0; + while (test_helper()) { + System.arraycopy(src, 0, dest, 0, len); + // predicate moved out of loop so control of following + // load is not the ArrayCopyNode. Otherwise, if the memory + // of the load is changed and the control is set to the + // ArrayCopyNode the graph is unschedulable and the test + // doesn't fail. + if (flag) { + } + // The memory of this load shouldn't bypass the arraycopy + res = dest[0]; + } + return res; + } + + static public void main(String[] args) { + int[] src = new int[10]; + src[0] = 0x42; + for (int i = 0; i < 20000; i++) { + int res = test(src, 10, false); + if (res != src[0]) { + throw new RuntimeException("test failed"); + } + } + } +} diff --git a/hotspot/test/compiler/intrinsics/sha/cli/SHAOptionsBase.java b/hotspot/test/compiler/intrinsics/sha/cli/SHAOptionsBase.java index b2190bb89a6..c58299601fa 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/SHAOptionsBase.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/SHAOptionsBase.java @@ -71,7 +71,7 @@ public class SHAOptionsBase extends CommandLineOptionTest { * instructions required by the option are not supported. */ protected static String getWarningForUnsupportedCPU(String optionName) { - if (Platform.isSparc()) { + if (Platform.isSparc() || Platform.isAArch64()) { switch (optionName) { case SHAOptionsBase.USE_SHA_OPTION: return SHAOptionsBase.SHA_INSTRUCTIONS_ARE_NOT_AVAILABLE; diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnSupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnSupportedCPU.java index 335fd0dd60b..42cecbcd1eb 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnSupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnSupportedCPU.java @@ -36,7 +36,7 @@ */ public class TestUseSHA1IntrinsicsOptionOnSupportedCPU { public static void main(String args[]) throws Throwable { - new SHAOptionsBase(new GenericTestCaseForSupportedSparcCPU( + new SHAOptionsBase(new GenericTestCaseForSupportedCPU( SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION)).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnUnsupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnUnsupportedCPU.java index fe7b61b44d0..56ed80671ad 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnUnsupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA1IntrinsicsOptionOnUnsupportedCPU.java @@ -40,10 +40,12 @@ public class TestUseSHA1IntrinsicsOptionOnUnsupportedCPU { new SHAOptionsBase( new GenericTestCaseForUnsupportedSparcCPU( SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION), - new UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU( - SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION), new GenericTestCaseForUnsupportedX86CPU( SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION), + new GenericTestCaseForUnsupportedAArch64CPU( + SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION), + new UseSHAIntrinsicsSpecificTestCaseForUnsupportedCPU( + SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION), new GenericTestCaseForOtherCPU( SHAOptionsBase.USE_SHA1_INTRINSICS_OPTION)).test(); } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnSupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnSupportedCPU.java index fb73192e32f..dea1a34b110 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnSupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnSupportedCPU.java @@ -37,7 +37,7 @@ */ public class TestUseSHA256IntrinsicsOptionOnSupportedCPU { public static void main(String args[]) throws Throwable { - new SHAOptionsBase(new GenericTestCaseForSupportedSparcCPU( + new SHAOptionsBase(new GenericTestCaseForSupportedCPU( SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION)).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnUnsupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnUnsupportedCPU.java index bfe7eb7b98b..741b00d3270 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnUnsupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA256IntrinsicsOptionOnUnsupportedCPU.java @@ -40,10 +40,12 @@ public class TestUseSHA256IntrinsicsOptionOnUnsupportedCPU { new SHAOptionsBase( new GenericTestCaseForUnsupportedSparcCPU( SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION), - new UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU( - SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION), new GenericTestCaseForUnsupportedX86CPU( SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION), + new GenericTestCaseForUnsupportedAArch64CPU( + SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION), + new UseSHAIntrinsicsSpecificTestCaseForUnsupportedCPU( + SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION), new GenericTestCaseForOtherCPU( SHAOptionsBase.USE_SHA256_INTRINSICS_OPTION)).test(); } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnSupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnSupportedCPU.java index 65c5dc1d311..192c08ce670 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnSupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnSupportedCPU.java @@ -37,7 +37,7 @@ */ public class TestUseSHA512IntrinsicsOptionOnSupportedCPU { public static void main(String args[]) throws Throwable { - new SHAOptionsBase(new GenericTestCaseForSupportedSparcCPU( + new SHAOptionsBase(new GenericTestCaseForSupportedCPU( SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION)).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnUnsupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnUnsupportedCPU.java index d000438e844..9f448616068 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnUnsupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHA512IntrinsicsOptionOnUnsupportedCPU.java @@ -40,10 +40,12 @@ public class TestUseSHA512IntrinsicsOptionOnUnsupportedCPU { new SHAOptionsBase( new GenericTestCaseForUnsupportedSparcCPU( SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION), - new UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU( - SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION), new GenericTestCaseForUnsupportedX86CPU( SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION), + new GenericTestCaseForUnsupportedAArch64CPU( + SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION), + new UseSHAIntrinsicsSpecificTestCaseForUnsupportedCPU( + SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION), new GenericTestCaseForOtherCPU( SHAOptionsBase.USE_SHA512_INTRINSICS_OPTION)).test(); } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnSupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnSupportedCPU.java index e6b2400c5a6..d9f54215659 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnSupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnSupportedCPU.java @@ -37,9 +37,9 @@ public class TestUseSHAOptionOnSupportedCPU { public static void main(String args[]) throws Throwable { new SHAOptionsBase( - new GenericTestCaseForSupportedSparcCPU( + new GenericTestCaseForSupportedCPU( SHAOptionsBase.USE_SHA_OPTION), - new UseSHASpecificTestCaseForSupportedSparcCPU( + new UseSHASpecificTestCaseForSupportedCPU( SHAOptionsBase.USE_SHA_OPTION)).test(); } } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnUnsupportedCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnUnsupportedCPU.java index 3fbcd67fd28..15ec6160e9c 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnUnsupportedCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/TestUseSHAOptionOnUnsupportedCPU.java @@ -39,10 +39,12 @@ public class TestUseSHAOptionOnUnsupportedCPU { new SHAOptionsBase( new GenericTestCaseForUnsupportedSparcCPU( SHAOptionsBase.USE_SHA_OPTION), - new UseSHASpecificTestCaseForUnsupportedSparcCPU( - SHAOptionsBase.USE_SHA_OPTION), new GenericTestCaseForUnsupportedX86CPU( SHAOptionsBase.USE_SHA_OPTION), + new GenericTestCaseForUnsupportedAArch64CPU( + SHAOptionsBase.USE_SHA_OPTION), + new UseSHASpecificTestCaseForUnsupportedCPU( + SHAOptionsBase.USE_SHA_OPTION), new GenericTestCaseForOtherCPU( SHAOptionsBase.USE_SHA_OPTION)).test(); } diff --git a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForOtherCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForOtherCPU.java index 56d0a2931d1..ca11075c37d 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForOtherCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForOtherCPU.java @@ -35,16 +35,18 @@ public class GenericTestCaseForOtherCPU extends SHAOptionsBase.TestCase { public GenericTestCaseForOtherCPU(String optionName) { // Execute the test case on any CPU except SPARC and X86 - super(optionName, new NotPredicate(new OrPredicate(Platform::isSparc, - new OrPredicate(Platform::isX64, Platform::isX86)))); + super(optionName, new NotPredicate( + new OrPredicate( + new OrPredicate(Platform::isSparc, Platform::isAArch64), + new OrPredicate(Platform::isX64, Platform::isX86)))); } @Override protected void verifyWarnings() throws Throwable { String shouldPassMessage = String.format("JVM should start with " + "option '%s' without any warnings", optionName); - // Verify that on non-x86 and non-SPARC CPU usage of SHA-related - // options will not cause any warnings. + // Verify that on non-x86, non-SPARC and non-AArch64 CPU usage of + // SHA-related options will not cause any warnings. CommandLineOptionTest.verifySameJVMStartup(null, new String[] { ".*" + optionName + ".*" }, shouldPassMessage, shouldPassMessage, ExitCode.OK, diff --git a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedSparcCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedCPU.java similarity index 92% rename from hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedSparcCPU.java rename to hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedCPU.java index 8db8d7971ef..8a59d6392f7 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedSparcCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForSupportedCPU.java @@ -25,16 +25,19 @@ import jdk.test.lib.ExitCode; import jdk.test.lib.Platform; import jdk.test.lib.cli.CommandLineOptionTest; import jdk.test.lib.cli.predicate.AndPredicate; +import jdk.test.lib.cli.predicate.OrPredicate; /** - * Generic test case for SHA-related options targeted to SPARC CPUs which + * Generic test case for SHA-related options targeted to CPUs which * support instructions required by the tested option. */ -public class GenericTestCaseForSupportedSparcCPU extends +public class GenericTestCaseForSupportedCPU extends SHAOptionsBase.TestCase { - public GenericTestCaseForSupportedSparcCPU(String optionName) { - super(optionName, new AndPredicate(Platform::isSparc, - SHAOptionsBase.getPredicateForOption(optionName))); + public GenericTestCaseForSupportedCPU(String optionName) { + super(optionName, + new AndPredicate( + new OrPredicate(Platform::isSparc, Platform::isAArch64), + SHAOptionsBase.getPredicateForOption(optionName))); } @Override diff --git a/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedAArch64CPU.java b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedAArch64CPU.java new file mode 100644 index 00000000000..47bf312bfb2 --- /dev/null +++ b/hotspot/test/compiler/intrinsics/sha/cli/testcases/GenericTestCaseForUnsupportedAArch64CPU.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import jdk.test.lib.ExitCode; +import jdk.test.lib.Platform; +import jdk.test.lib.cli.CommandLineOptionTest; +import jdk.test.lib.cli.predicate.AndPredicate; +import jdk.test.lib.cli.predicate.NotPredicate; + +/** + * Generic test case for SHA-related options targeted to AArch64 CPUs + * which don't support instruction required by the tested option. + */ +public class GenericTestCaseForUnsupportedAArch64CPU extends + SHAOptionsBase.TestCase { + public GenericTestCaseForUnsupportedAArch64CPU(String optionName) { + super(optionName, new AndPredicate(Platform::isAArch64, + new NotPredicate(SHAOptionsBase.getPredicateForOption( + optionName)))); + } + + @Override + protected void verifyWarnings() throws Throwable { + String shouldPassMessage = String.format("JVM startup should pass with" + + "option '-XX:-%s' without any warnings", optionName); + //Verify that option could be disabled without any warnings. + CommandLineOptionTest.verifySameJVMStartup(null, new String[] { + SHAOptionsBase.getWarningForUnsupportedCPU(optionName) + }, shouldPassMessage, shouldPassMessage, ExitCode.OK, + CommandLineOptionTest.prepareBooleanFlag(optionName, false)); + + shouldPassMessage = String.format("JVM should start with '-XX:+" + + "%s' flag, but output should contain warning.", optionName); + // Verify that when the tested option is explicitly enabled, then + // a warning will occur in VM output. + CommandLineOptionTest.verifySameJVMStartup(new String[] { + SHAOptionsBase.getWarningForUnsupportedCPU(optionName) + }, null, shouldPassMessage, shouldPassMessage, ExitCode.OK, + CommandLineOptionTest.prepareBooleanFlag(optionName, true)); + } + + @Override + protected void verifyOptionValues() throws Throwable { + // Verify that option is disabled by default. + CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + String.format("Option '%s' should be disabled by default", + optionName)); + + // Verify that option is disabled even if it was explicitly enabled + // using CLI options. + CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + String.format("Option '%s' should be off on unsupported " + + "AArch64CPU even if set to true directly", optionName), + CommandLineOptionTest.prepareBooleanFlag(optionName, true)); + + // Verify that option is disabled when +UseSHA was passed to JVM. + CommandLineOptionTest.verifyOptionValueForSameVM(optionName, "false", + String.format("Option '%s' should be off on unsupported " + + "AArch64CPU even if %s flag set to JVM", + optionName, CommandLineOptionTest.prepareBooleanFlag( + SHAOptionsBase.USE_SHA_OPTION, true)), + CommandLineOptionTest.prepareBooleanFlag( + SHAOptionsBase.USE_SHA_OPTION, true)); + } +} diff --git a/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHAIntrinsicsSpecificTestCaseForUnsupportedCPU.java similarity index 87% rename from hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU.java rename to hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHAIntrinsicsSpecificTestCaseForUnsupportedCPU.java index 7f7923c38bc..6ba51bb98ae 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHAIntrinsicsSpecificTestCaseForUnsupportedCPU.java @@ -25,24 +25,26 @@ import jdk.test.lib.ExitCode; import jdk.test.lib.Platform; import jdk.test.lib.cli.CommandLineOptionTest; import jdk.test.lib.cli.predicate.AndPredicate; +import jdk.test.lib.cli.predicate.OrPredicate; import jdk.test.lib.cli.predicate.NotPredicate; import sha.predicate.IntrinsicPredicates; /** - * Test case specific to UseSHA*Intrinsics options targeted to SPARC CPUs which - * don't support required instruction, but support other SHA-related + * Test case specific to UseSHA*Intrinsics options targeted to SPARC and AArch64 + * CPUs which don't support required instruction, but support other SHA-related * instructions. * * For example, CPU support sha1 instruction, but don't support sha256 or * sha512. */ -public class UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU +public class UseSHAIntrinsicsSpecificTestCaseForUnsupportedCPU extends SHAOptionsBase.TestCase { - public UseSHAIntrinsicsSpecificTestCaseForUnsupportedSparcCPU( + public UseSHAIntrinsicsSpecificTestCaseForUnsupportedCPU( String optionName) { // execute test case on SPARC CPU that support any sha* instructions, // but does not support sha* instruction required by the tested option. - super(optionName, new AndPredicate(Platform::isSparc, + super(optionName, new AndPredicate( + new OrPredicate(Platform::isSparc, Platform::isAArch64), new AndPredicate( IntrinsicPredicates.ANY_SHA_INSTRUCTION_AVAILABLE, new NotPredicate(SHAOptionsBase.getPredicateForOption( diff --git a/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForSupportedSparcCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForSupportedCPU.java similarity index 93% rename from hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForSupportedSparcCPU.java rename to hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForSupportedCPU.java index 2f44b712b6d..9349a3330bd 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForSupportedSparcCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForSupportedCPU.java @@ -26,16 +26,18 @@ import jdk.test.lib.ExitCode; import jdk.test.lib.Platform; import jdk.test.lib.cli.CommandLineOptionTest; import jdk.test.lib.cli.predicate.AndPredicate; +import jdk.test.lib.cli.predicate.OrPredicate; import sha.predicate.IntrinsicPredicates; /** - * UseSHA specific test case targeted to SPARC CPUs which support any sha* - * instruction. + * UseSHA specific test case targeted to SPARC and AArch64 CPUs which + * support any sha* instruction. */ -public class UseSHASpecificTestCaseForSupportedSparcCPU +public class UseSHASpecificTestCaseForSupportedCPU extends SHAOptionsBase.TestCase { - public UseSHASpecificTestCaseForSupportedSparcCPU(String optionName) { - super(SHAOptionsBase.USE_SHA_OPTION, new AndPredicate(Platform::isSparc, + public UseSHASpecificTestCaseForSupportedCPU(String optionName) { + super(SHAOptionsBase.USE_SHA_OPTION, new AndPredicate( + new OrPredicate(Platform::isSparc, Platform::isAArch64), IntrinsicPredicates.ANY_SHA_INSTRUCTION_AVAILABLE)); Asserts.assertEQ(optionName, SHAOptionsBase.USE_SHA_OPTION, diff --git a/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForUnsupportedSparcCPU.java b/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForUnsupportedCPU.java similarity index 89% rename from hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForUnsupportedSparcCPU.java rename to hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForUnsupportedCPU.java index 15bf563bc45..d325ddaf113 100644 --- a/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForUnsupportedSparcCPU.java +++ b/hotspot/test/compiler/intrinsics/sha/cli/testcases/UseSHASpecificTestCaseForUnsupportedCPU.java @@ -26,17 +26,19 @@ import jdk.test.lib.ExitCode; import jdk.test.lib.Platform; import jdk.test.lib.cli.CommandLineOptionTest; import jdk.test.lib.cli.predicate.AndPredicate; +import jdk.test.lib.cli.predicate.OrPredicate; import jdk.test.lib.cli.predicate.NotPredicate; import sha.predicate.IntrinsicPredicates; /** - * UseSHA specific test case targeted to SPARC CPUs which don't support all sha* - * instructions. + * UseSHA specific test case targeted to SPARC and AArch64 CPUs which don't + * support all sha* instructions./ */ -public class UseSHASpecificTestCaseForUnsupportedSparcCPU +public class UseSHASpecificTestCaseForUnsupportedCPU extends SHAOptionsBase.TestCase { - public UseSHASpecificTestCaseForUnsupportedSparcCPU(String optionName) { - super(SHAOptionsBase.USE_SHA_OPTION, new AndPredicate(Platform::isSparc, + public UseSHASpecificTestCaseForUnsupportedCPU(String optionName) { + super(SHAOptionsBase.USE_SHA_OPTION, new AndPredicate( + new OrPredicate(Platform::isSparc, Platform::isAArch64), new NotPredicate( IntrinsicPredicates.ANY_SHA_INSTRUCTION_AVAILABLE))); @@ -49,7 +51,7 @@ public class UseSHASpecificTestCaseForUnsupportedSparcCPU protected void verifyWarnings() throws Throwable { // Verify that attempt to use UseSHA option will cause a warning. String shouldPassMessage = String.format("JVM startup should pass with" - + " '%s' option on unsupported SparcCPU, but there should be" + + " '%s' option on unsupported CPU, but there should be" + "the message shown.", optionName); CommandLineOptionTest.verifySameJVMStartup(new String[] { SHAOptionsBase.getWarningForUnsupportedCPU(optionName) @@ -63,7 +65,7 @@ public class UseSHASpecificTestCaseForUnsupportedSparcCPU // UseSHA*Intrinsics were enabled. CommandLineOptionTest.verifyOptionValueForSameVM( SHAOptionsBase.USE_SHA_OPTION, "false", String.format( - "%s option should be disabled on unsupported SparcCPU" + "%s option should be disabled on unsupported CPU" + " even if all UseSHA*Intrinsics options were enabled.", SHAOptionsBase.USE_SHA_OPTION), CommandLineOptionTest.prepareBooleanFlag( @@ -77,7 +79,7 @@ public class UseSHASpecificTestCaseForUnsupportedSparcCPU // UseSHA*Intrinsics options were enabled and UseSHA was enabled as well. CommandLineOptionTest.verifyOptionValueForSameVM( SHAOptionsBase.USE_SHA_OPTION, "false", String.format( - "%s option should be disabled on unsupported SparcCPU" + "%s option should be disabled on unsupported CPU" + " even if all UseSHA*Intrinsics options were enabled" + " and %s was enabled as well", SHAOptionsBase.USE_SHA_OPTION, diff --git a/hotspot/test/compiler/jsr292/PollutedTrapCounts.java b/hotspot/test/compiler/jsr292/PollutedTrapCounts.java new file mode 100644 index 00000000000..7aecdae9f5e --- /dev/null +++ b/hotspot/test/compiler/jsr292/PollutedTrapCounts.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact 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 8074551 + * @library /testlibrary + * @run main PollutedTrapCounts + */ +import java.lang.invoke.*; +import jdk.test.lib.*; + +public class PollutedTrapCounts { + public static void main(String[] args) throws Exception { + ProcessBuilder pb = ProcessTools.createJavaProcessBuilder( + "-XX:+IgnoreUnrecognizedVMOptions", + "-XX:-TieredCompilation", "-Xbatch", + "-XX:PerBytecodeRecompilationCutoff=10", "-XX:PerMethodRecompilationCutoff=10", + "-XX:+PrintCompilation", "-XX:+UnlockDiagnosticVMOptions", "-XX:+PrintInlining", + "PollutedTrapCounts$Test"); + + OutputAnalyzer analyzer = new OutputAnalyzer(pb.start()); + + analyzer.shouldHaveExitValue(0); + + analyzer.shouldNotContain("not compilable (disabled)"); + } + + static class Test { + public static final MethodHandle test1; + public static final MethodHandle test2; + public static final MethodHandle empty; + + static { + try { + Class THIS_CLASS = Test.class; + MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + test1 = LOOKUP.findStatic(THIS_CLASS, "test1", MethodType.methodType(boolean.class, boolean.class)); + test2 = LOOKUP.findStatic(THIS_CLASS, "test2", MethodType.methodType(boolean.class, boolean.class)); + empty = LOOKUP.findStatic(THIS_CLASS, "empty", MethodType.methodType(void.class, boolean.class)); + } catch(Throwable e) { + throw new Error(e); + } + } + + static boolean test1(boolean b) { + return b; + } + static boolean test2(boolean b) { + return true; + } + static void empty(boolean b) {} + + static void test(boolean freqValue, boolean removeInlineBlocker) throws Throwable { + MethodHandle innerGWT = MethodHandles.guardWithTest(test1, empty, empty); + MethodHandle outerGWT = MethodHandles.guardWithTest(test2, innerGWT, innerGWT); + + // Trigger compilation + for (int i = 0; i < 20_000; i++) { + outerGWT.invokeExact(freqValue); + } + + // Trigger deopt & nmethod invalidation + outerGWT.invokeExact(!freqValue); + + // Force inline blocker removal on rare-taken path + if (removeInlineBlocker) { + for (int i = 0; i < 100; i++) { + outerGWT.invokeExact(!freqValue); + } + } + + // Trigger recompilation + for (int i = 0; i < 20_000; i++) { + outerGWT.invokeExact(freqValue); + } + } + + public static void main(String[] args) throws Throwable { + boolean freqValue = true; + boolean removeInlineBlocker = false; + for (int i = 0; i < 20; i++) { + test(freqValue, removeInlineBlocker); + freqValue = !freqValue; + removeInlineBlocker = !removeInlineBlocker; + } + } + } +} diff --git a/hotspot/test/compiler/testlibrary/sha/predicate/IntrinsicPredicates.java b/hotspot/test/compiler/testlibrary/sha/predicate/IntrinsicPredicates.java index dedc8fae5c2..5f423d38a2c 100644 --- a/hotspot/test/compiler/testlibrary/sha/predicate/IntrinsicPredicates.java +++ b/hotspot/test/compiler/testlibrary/sha/predicate/IntrinsicPredicates.java @@ -59,16 +59,19 @@ public class IntrinsicPredicates { }; public static final BooleanSupplier SHA1_INSTRUCTION_AVAILABLE - = new CPUSpecificPredicate("sparc.*", new String[] { "sha1" }, - null); + = new OrPredicate( + new CPUSpecificPredicate("sparc.*", new String[] { "sha1" },null), + new CPUSpecificPredicate("aarch64.*", new String[] { "sha1" },null)); public static final BooleanSupplier SHA256_INSTRUCTION_AVAILABLE - = new CPUSpecificPredicate("sparc.*", new String[] { "sha256" }, - null); + = new OrPredicate( + new CPUSpecificPredicate("sparc.*", new String[] { "sha256" },null), + new CPUSpecificPredicate("aarch64.*", new String[] { "sha256" },null)); public static final BooleanSupplier SHA512_INSTRUCTION_AVAILABLE - = new CPUSpecificPredicate("sparc.*", new String[] { "sha512" }, - null); + = new OrPredicate( + new CPUSpecificPredicate("sparc.*", new String[] { "sha512" },null), + new CPUSpecificPredicate("aarch64.*", new String[] { "sha512" },null)); public static final BooleanSupplier ANY_SHA_INSTRUCTION_AVAILABLE = new OrPredicate(IntrinsicPredicates.SHA1_INSTRUCTION_AVAILABLE, diff --git a/hotspot/test/testlibrary_tests/RandomGeneratorTest.java b/hotspot/test/testlibrary_tests/RandomGeneratorTest.java index e0312998569..4344f1d2d44 100644 --- a/hotspot/test/testlibrary_tests/RandomGeneratorTest.java +++ b/hotspot/test/testlibrary_tests/RandomGeneratorTest.java @@ -32,11 +32,15 @@ * @run driver RandomGeneratorTest DIFFERENT_SEED */ -import jdk.test.lib.ProcessTools; -import jdk.test.lib.Utils; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import java.util.Random; +import jdk.test.lib.OutputAnalyzer; +import jdk.test.lib.ProcessTools; +import jdk.test.lib.Utils; /** * The test verifies correctness of work {@link jdk.test.lib.Utils#getRandomInstance()}. @@ -59,8 +63,13 @@ public class RandomGeneratorTest { jvmArgs.add(optStr); } jvmArgs.add(RandomRunner.class.getName()); + String origFileName = seedOpt.name() + "_orig"; + jvmArgs.add(origFileName); + int fileNameIndex = jvmArgs.size() - 1; String[] cmdLineArgs = jvmArgs.toArray(new String[jvmArgs.size()]); - String etalon = ProcessTools.executeTestJvm(cmdLineArgs).getStdout().trim(); + ProcessTools.executeTestJvm(cmdLineArgs).shouldHaveExitValue(0); + String etalon = Utils.fileAsString(origFileName).trim(); + cmdLineArgs[fileNameIndex] = seedOpt.name(); seedOpt.verify(etalon, cmdLineArgs); } @@ -121,26 +130,31 @@ public class RandomGeneratorTest { * @throws Throwable - Throws an exception in case test failure. */ public void verify(String orig, String[] cmdLine) { - String lastLineOrig = getLastLine(orig); - String lastLine; + String output; + OutputAnalyzer oa; try { - lastLine = getLastLine(ProcessTools.executeTestJvm(cmdLine).getStdout().trim()); + oa = ProcessTools.executeTestJvm(cmdLine); } catch (Throwable t) { throw new Error("TESTBUG: Unexpedted exception during jvm execution.", t); } - if (!isOutputExpected(lastLineOrig, lastLine)) { - throw new AssertionError("Unexpected random number sequence for mode: " + this.name()); + oa.shouldHaveExitValue(0); + try { + output = Utils.fileAsString(name()).trim(); + } catch (IOException ioe) { + throw new Error("TESTBUG: Problem during IO operation with file: " + name(), ioe); + } + if (!isOutputExpected(orig, output)) { + System.err.println("Initial output: " + orig); + System.err.println("Second run output: " + output); + throw new AssertionError("Unexpected random number sequence for mode: " + this.name()); } - } - - private static String getLastLine(String output) { - return output.substring(output.lastIndexOf(Utils.NEW_LINE)).trim(); } } /** * The helper class generates several random numbers - * and prints them out. + * and put results to a file. The file name came as first + * command line argument. */ public static class RandomRunner { private static final int COUNT = 10; @@ -150,7 +164,11 @@ public class RandomGeneratorTest { for (int i = 0; i < COUNT; i++) { sb.append(rng.nextLong()).append(' '); } - System.out.println(sb.toString()); + try (PrintWriter pw = new PrintWriter(new FileWriter(args[0]))) { + pw.write(sb.toString()); + } catch (IOException ioe) { + throw new Error("TESTBUG: Problem during IO operation with file: " + args[0], ioe); + } } } } diff --git a/jaxp/.hgtags b/jaxp/.hgtags index 3ed239facb6..fa176f60ff2 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -310,3 +310,5 @@ f4a4a54620370f077c2e830a5561c8cfa811712b jdk9-b61 ae7406e82828fe1c245ac7507a9da5fd5b1c9529 jdk9-b65 d5963ccce28d7a3e96ee3e2dc8a8676e61699b70 jdk9-b66 78c2685daabafae827c686ca2d1bb2e451faed2b jdk9-b67 +82aae947938ec9b0119fdd78a616d0b7263072ee jdk9-b68 +f844a908d3308f47d73cf64e87c98d37d5d76ce8 jdk9-b69 diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/FunctionTable.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/FunctionTable.java index 2b653aca47e..6d5b7ff3394 100644 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/FunctionTable.java +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/FunctionTable.java @@ -1,21 +1,23 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. */ -/* - * Copyright 1999-2005 The Apache Software Foundation. +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ /* * $Id: FunctionTable.java,v 1.3 2005/09/28 13:49:34 pvedula Exp $ @@ -135,6 +137,9 @@ public class FunctionTable /** The 'unparsed-entity-uri()' id (XSLT). */ public static final int FUNC_UNPARSED_ENTITY_URI = 36; + /** The 'here()' id (XML Signature). */ + public static final int FUNC_HERE = 37; + // Proprietary /** The 'document-location()' id (Proprietary). */ @@ -162,7 +167,7 @@ public class FunctionTable * Number of built in functions. Be sure to update this as * built-in functions are added. */ - private static final int NUM_BUILT_IN_FUNCS = 37; + private static final int NUM_BUILT_IN_FUNCS = 38; /** * Number of built-in functions that may be added. @@ -229,6 +234,8 @@ public class FunctionTable com.sun.org.apache.xpath.internal.functions.FuncDoclocation.class; m_functions[FUNC_UNPARSED_ENTITY_URI] = com.sun.org.apache.xpath.internal.functions.FuncUnparsedEntityURI.class; + m_functions[FUNC_HERE] = + com.sun.org.apache.xpath.internal.functions.FuncHere.class; } static{ @@ -302,6 +309,8 @@ public class FunctionTable new Integer(FunctionTable.FUNC_UNPARSED_ENTITY_URI)); m_functionID.put(Keywords.FUNC_DOCLOCATION_STRING, new Integer(FunctionTable.FUNC_DOCLOCATION)); + m_functionID.put(Keywords.FUNC_HERE_STRING, + new Integer(FunctionTable.FUNC_HERE)); } public FunctionTable(){ diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/Keywords.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/Keywords.java index 4c422c9175c..e0e47d988c5 100644 --- a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/Keywords.java +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/compiler/Keywords.java @@ -1,21 +1,23 @@ /* - * reserved comment block - * DO NOT REMOVE OR ALTER! + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. */ -/* - * Copyright 1999-2005 The Apache Software Foundation. +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. */ /* * $Id: Keywords.java,v 1.2.4.1 2005/09/14 19:46:01 jeffsuttor Exp $ @@ -210,6 +212,9 @@ public class Keywords public static final String FUNC_UNPARSED_ENTITY_URI_STRING = "unparsed-entity-uri"; + /** here function string (XML Signature). */ + public static final String FUNC_HERE_STRING = "here"; + // Proprietary, built in functions /** current function string (Proprietary). */ diff --git a/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/functions/FuncHere.java b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/functions/FuncHere.java new file mode 100644 index 00000000000..e52c08d5435 --- /dev/null +++ b/jaxp/src/java.xml/share/classes/com/sun/org/apache/xpath/internal/functions/FuncHere.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + */ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package com.sun.org.apache.xpath.internal.functions; + +import javax.xml.transform.TransformerException; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import com.sun.org.apache.xml.internal.dtm.DTM; +import com.sun.org.apache.xpath.internal.NodeSetDTM; +import com.sun.org.apache.xpath.internal.XPathContext; +import com.sun.org.apache.xpath.internal.objects.XNodeSet; +import com.sun.org.apache.xpath.internal.objects.XObject; +import com.sun.org.apache.xpath.internal.res.XPATHErrorResources; + +/** + * Execute the XML Signature here() function. + */ +public final class FuncHere extends Function { + + private static final long serialVersionUID = 4328660760070034592L; + + @Override + public XObject execute(XPathContext xctxt) throws TransformerException { + Node xpathOwnerNode = (Node)xctxt.getOwnerObject(); + if (xpathOwnerNode == null) { + return null; + } + + int xpathOwnerNodeDTM = xctxt.getDTMHandleFromNode(xpathOwnerNode); + int currentNode = xctxt.getCurrentNode(); + DTM dtm = xctxt.getDTM(currentNode); + int docContext = dtm.getDocument(); + + if (docContext == DTM.NULL) { + error(xctxt, XPATHErrorResources.ER_CONTEXT_HAS_NO_OWNERDOC, null); + } + + // check whether currentNode and the node containing the XPath + // expression are in the same document + Document currentDoc = getOwnerDocument(dtm.getNode(currentNode)); + Document xpathOwnerDoc = getOwnerDocument(xpathOwnerNode); + + if (currentDoc != xpathOwnerDoc) { + throw new TransformerException("Owner documents differ"); + } + + XNodeSet nodes = new XNodeSet(xctxt.getDTMManager()); + NodeSetDTM nodeSet = nodes.mutableNodeset(); + + int hereNode = DTM.NULL; + + switch (dtm.getNodeType(xpathOwnerNodeDTM)) { + + case Node.ATTRIBUTE_NODE: + case Node.PROCESSING_INSTRUCTION_NODE: { + // returns a node-set containing the attribute / processing + // instruction node + hereNode = xpathOwnerNodeDTM; + nodeSet.addNode(hereNode); + break; + } + case Node.TEXT_NODE : { + // returns a node-set containing the parent element of the + // text node that directly bears the XPath expression + hereNode = dtm.getParent(xpathOwnerNodeDTM); + nodeSet.addNode(hereNode); + break; + } + default : + break; + } + + /** $todo$ Do I have to do this detach() call? */ + nodeSet.detach(); + + return nodes; + } + + private static Document getOwnerDocument(Node node) { + if (node.getNodeType() == Node.DOCUMENT_NODE) { + return (Document)node; + } + return node.getOwnerDocument(); + } + + @Override + public void fixupVariables(java.util.Vector vars, int globalsSize) { } +} diff --git a/jaxp/test/javax/xml/jaxp/functional/TEST.properties b/jaxp/test/javax/xml/jaxp/functional/TEST.properties index a8ef42cafa3..f94f3b92152 100644 --- a/jaxp/test/javax/xml/jaxp/functional/TEST.properties +++ b/jaxp/test/javax/xml/jaxp/functional/TEST.properties @@ -7,3 +7,6 @@ lib.dirs = /javax/xml/jaxp/libs # Tests that must run in othervm mode othervm.dirs= /javax/xml/jaxp/functional +# Declare module dependency +modules=java.xml + diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderFactoryTest.java b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderFactoryTest.java index f2ab3f565f8..77196ee720d 100644 --- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderFactoryTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/parsers/ptests/DocumentBuilderFactoryTest.java @@ -23,28 +23,32 @@ package javax.xml.parsers.ptests; +import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI; +import static javax.xml.parsers.ptests.ParserTestConst.GOLDEN_DIR; +import static javax.xml.parsers.ptests.ParserTestConst.XML_DIR; +import static jaxp.library.JAXPTestUtilities.USER_DIR; +import static jaxp.library.JAXPTestUtilities.compareWithGold; +import static jaxp.library.JAXPTestUtilities.filenameToURL; 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.Closeable; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FilePermission; import java.io.FileReader; -import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI; - import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; - -import static javax.xml.parsers.ptests.ParserTestConst.GOLDEN_DIR; -import static javax.xml.parsers.ptests.ParserTestConst.XML_DIR; - import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; @@ -52,10 +56,6 @@ import javax.xml.transform.sax.SAXResult; import jaxp.library.JAXPDataProvider; import jaxp.library.JAXPFileBaseTest; -import static jaxp.library.JAXPTestUtilities.USER_DIR; -import static jaxp.library.JAXPTestUtilities.compareWithGold; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertTrue; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; @@ -67,6 +67,7 @@ import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; /** + * @bug 8080907 * This checks the methods of DocumentBuilderFactoryImpl. */ public class DocumentBuilderFactoryTest extends JAXPFileBaseTest { @@ -134,28 +135,11 @@ public class DocumentBuilderFactoryTest extends JAXPFileBaseTest { assertFalse(eh.isErrorOccured()); } - /** - * Test the default functionality of schema support method. In - * this case the schema source property is set. - * @throws Exception If any errors occur. - */ - @Test - public void testCheckSchemaSupport2() throws Exception { - try (FileInputStream fis = new FileInputStream(new File( - XML_DIR, "test.xsd"))) { - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - dbf.setValidating(true); - dbf.setNamespaceAware(true); - dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", - W3C_XML_SCHEMA_NS_URI); - dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", - new InputSource(fis)); - MyErrorHandler eh = MyErrorHandler.newInstance(); - DocumentBuilder db = dbf.newDocumentBuilder(); - db.setErrorHandler(eh); - db.parse(new File(XML_DIR, "test1.xml")); - assertFalse(eh.isErrorOccured()); - } + @DataProvider(name = "schema-source") + public Object[][] getSchemaSource() throws FileNotFoundException { + return new Object[][] { + { new FileInputStream(new File(XML_DIR, "test.xsd")) }, + { new InputSource(filenameToURL(XML_DIR + "test.xsd")) } }; } /** @@ -163,22 +147,50 @@ public class DocumentBuilderFactoryTest extends JAXPFileBaseTest { * this case the schema source property is set. * @throws Exception If any errors occur. */ - @Test - public void testCheckSchemaSupport3() throws Exception { - try (FileInputStream fis = new FileInputStream(new File( - XML_DIR, "test.xsd"))) { + @Test(dataProvider = "schema-source") + public void testCheckSchemaSupport2(Object schemaSource) throws Exception { + try { + DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); + dbf.setValidating(true); + dbf.setNamespaceAware(true); + dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaLanguage", + W3C_XML_SCHEMA_NS_URI); + dbf.setAttribute("http://java.sun.com/xml/jaxp/properties/schemaSource", schemaSource); + MyErrorHandler eh = MyErrorHandler.newInstance(); + DocumentBuilder db = dbf.newDocumentBuilder(); + db.setErrorHandler(eh); + db.parse(new File(XML_DIR, "test1.xml")); + assertFalse(eh.isErrorOccured()); + } finally { + if (schemaSource instanceof Closeable) { + ((Closeable) schemaSource).close(); + } + } + + } + + /** + * Test the default functionality of schema support method. In + * this case the schema source property is set. + * @throws Exception If any errors occur. + */ + @Test(dataProvider = "schema-source") + public void testCheckSchemaSupport3(Object schemaSource) throws Exception { + 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", W3C_XML_SCHEMA_NS_URI); - sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", - new InputSource(fis)); + sp.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource", schemaSource); DefaultHandler dh = new DefaultHandler(); // Not expect any unrecoverable error here. sp.parse(new File(XML_DIR, "test1.xml"), dh); + } finally { + if (schemaSource instanceof Closeable) { + ((Closeable) schemaSource).close(); + } } } diff --git a/jaxp/test/javax/xml/jaxp/functional/javax/xml/validation/ptests/SchemaFactoryTest.java b/jaxp/test/javax/xml/jaxp/functional/javax/xml/validation/ptests/SchemaFactoryTest.java index f2665263556..1cdcbf7e073 100644 --- a/jaxp/test/javax/xml/jaxp/functional/javax/xml/validation/ptests/SchemaFactoryTest.java +++ b/jaxp/test/javax/xml/jaxp/functional/javax/xml/validation/ptests/SchemaFactoryTest.java @@ -27,6 +27,7 @@ import static javax.xml.validation.ptests.ValidationTestConst.XML_DIR; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertSame; +import static org.testng.Assert.assertTrue; import java.io.ByteArrayInputStream; import java.io.File; @@ -39,9 +40,12 @@ import java.nio.file.Paths; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; import javax.xml.transform.Source; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stax.StAXSource; import javax.xml.transform.stream.StreamSource; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; @@ -60,6 +64,7 @@ import org.xml.sax.SAXNotSupportedException; import org.xml.sax.SAXParseException; /* + * @bug 8080907 * @summary Class containing the test cases for SchemaFactory */ @Test(singleThreaded = true) @@ -68,9 +73,10 @@ public class SchemaFactoryTest { @BeforeClass public void setup() throws SAXException, IOException, ParserConfigurationException { sf = newSchemaFactory(); - assertNotNull(sf); + ifac = XMLInputFactory.newInstance(); + xsd1 = Files.readAllBytes(Paths.get(XML_DIR + "test.xsd")); xsd2 = Files.readAllBytes(Paths.get(XML_DIR + "test1.xsd")); @@ -152,11 +158,13 @@ public class SchemaFactoryTest { } @DataProvider(name = "valid-source") - public Object[][] getValidSource() { + public Object[][] getValidSource() throws XMLStreamException { return new Object[][] { { streamSource(xsd1) }, { saxSource(xsd1) }, - { domSource(xsdDoc1) } }; + { domSource(xsdDoc1) }, + { staxStreamSource(xsd1) }, + { staxEventSource(xsd1) } }; } @@ -299,6 +307,34 @@ public class SchemaFactoryTest { sf.setFeature(null, true); } + @DataProvider(name = "source-feature") + public Object[][] getSourceFeature() { + return new Object[][] { + { StreamSource.FEATURE }, + { SAXSource.FEATURE }, + { DOMSource.FEATURE }, + { DOMSource.FEATURE } }; + + } + + /* + * Return true for each of the JAXP Source features to indicate that this + * SchemaFactory supports all of the built-in JAXP Source types. + */ + @Test(dataProvider = "source-feature") + public void testSourceFeatureGet(String sourceFeature) throws Exception { + assertTrue(newSchemaFactory().getFeature(sourceFeature)); + } + + /* + * JAXP Source features are read-only because this SchemaFactory always + * supports all JAXP Source types. + */ + @Test(dataProvider = "source-feature", expectedExceptions = SAXNotSupportedException.class) + public void testSourceFeatureSet(String sourceFeature) throws Exception { + newSchemaFactory().setFeature(sourceFeature, false); + } + @Test(expectedExceptions = IllegalArgumentException.class) public void testInvalidSchemaLanguage() { final String INVALID_SCHEMA_LANGUAGE = "http://relaxng.org/ns/structure/1.0"; @@ -337,6 +373,15 @@ public class SchemaFactoryTest { return new DOMSource(xsdDoc); } + private Source staxStreamSource(byte[] xsd) throws XMLStreamException { + return new StAXSource(ifac.createXMLStreamReader(newInputStream(xsd))); + } + + private Source staxEventSource(byte[] xsd) throws XMLStreamException { + return new StAXSource(ifac.createXMLEventReader(newInputStream(xsd))); + } + + private SchemaFactory newSchemaFactory() { return SchemaFactory.newInstance(W3C_XML_SCHEMA_NS_URI); } @@ -346,6 +391,7 @@ public class SchemaFactoryTest { private static final String SCHEMA_FACTORY_CLASSNAME = "com.sun.org.apache.xerces.internal.jaxp.validation.XMLSchemaFactory"; private SchemaFactory sf; + private XMLInputFactory ifac; private byte[] xsd1; private byte[] xsd2; private Document xsdDoc1; diff --git a/jaxp/test/javax/xml/jaxp/unittest/TEST.properties b/jaxp/test/javax/xml/jaxp/unittest/TEST.properties index e8445deaa68..23136c131a5 100644 --- a/jaxp/test/javax/xml/jaxp/unittest/TEST.properties +++ b/jaxp/test/javax/xml/jaxp/unittest/TEST.properties @@ -1,3 +1,6 @@ # jaxp test uses TestNG TestNG.dirs = . +# Declare module dependency +modules=java.xml + diff --git a/jaxp/test/javax/xml/jaxp/unittest/javax/xml/parsers/xinclude/Bug6794483Test.java b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/parsers/xinclude/Bug6794483Test.java index 735efe8932b..ee5e2587d6c 100644 --- a/jaxp/test/javax/xml/jaxp/unittest/javax/xml/parsers/xinclude/Bug6794483Test.java +++ b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/parsers/xinclude/Bug6794483Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,37 +23,47 @@ package javax.xml.parsers.xinclude; +import static java.lang.System.lineSeparator; +import static org.testng.Assert.assertEquals; + import java.io.File; -import java.io.IOException; import java.io.StringWriter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerConfigurationException; -import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; -import org.testng.Assert; import org.testng.annotations.Test; import org.w3c.dom.Document; -import org.xml.sax.SAXException; +import org.w3c.dom.NodeList; /* - * @bug 6794483 - * @summary Test JAXP parser can parse xml file using to include another xml, which has an empty element. + * @bug 6794483 8080908 + * @summary Test JAXP parser can resolve the included content properly if the + * included xml contains an empty tag that ends with "/>", refer to XERCESJ-1134. */ public class Bug6794483Test { @Test - public final void test() { - String xml = getClass().getResource("test1.xml").getPath(); - Document doc = parseXmlFile(xml); + public final void test() throws Exception { + Document doc = parseXmlFile(getClass().getResource("test1.xml").getPath()); + // check node4 + NodeList nodeList = doc.getElementsByTagName("node4"); + assertEquals(nodeList.getLength(), 1); + assertEquals(nodeList.item(0).getTextContent(), "Node4 Value", "The data of node4 is missed in parsing: " + lineSeparator() + printXmlDoc(doc)); + + // check node6 + nodeList = doc.getElementsByTagName("node6"); + assertEquals(nodeList.getLength(), 1); + assertEquals(nodeList.item(0).getTextContent(), "Node6 Value", "The data of node6 is missed in parsing: " + lineSeparator() + printXmlDoc(doc)); + } + + public String printXmlDoc(Document doc) throws Exception { StringWriter sw = new StringWriter(); StreamResult result = new StreamResult(sw); @@ -61,27 +71,16 @@ public class Bug6794483Test { transformerFact.setAttribute("indent-number", new Integer(4)); Transformer transformer; - try { - transformer = transformerFact.newTransformer(); - transformer.setOutputProperty(OutputKeys.INDENT, "yes"); - transformer.setOutputProperty(OutputKeys.METHOD, "xml"); - transformer.setOutputProperty(OutputKeys.MEDIA_TYPE, "text/xml"); - - // "true" indicate Append content If file exist in system - transformer.transform(new DOMSource(doc), result); - System.out.println("test" + sw); - - } catch (TransformerConfigurationException ex) { - ex.printStackTrace(); - Assert.fail("unexpected TransformerConfigurationException"); - } catch (TransformerException ex) { - ex.printStackTrace(); - Assert.fail("unexpected TransformerException"); - } + transformer = transformerFact.newTransformer(); + transformer.setOutputProperty(OutputKeys.INDENT, "yes"); + transformer.setOutputProperty(OutputKeys.METHOD, "xml"); + transformer.setOutputProperty(OutputKeys.MEDIA_TYPE, "text/xml"); + transformer.transform(new DOMSource(doc), result); + return sw.toString(); } - public Document parseXmlFile(String fileName) { + public Document parseXmlFile(String fileName) throws Exception { System.out.println("Parsing XML file... " + fileName); DocumentBuilder docBuilder = null; Document doc = null; @@ -92,20 +91,10 @@ public class Bug6794483Test { docBuilderFactory.setNamespaceAware(true); docBuilderFactory.setExpandEntityReferences(true); - try { - docBuilder = docBuilderFactory.newDocumentBuilder(); - } catch (ParserConfigurationException e) { - e.printStackTrace(); - } + docBuilder = docBuilderFactory.newDocumentBuilder(); File sourceFile = new File(fileName); - try { - doc = docBuilder.parse(sourceFile); - } catch (SAXException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } + doc = docBuilder.parse(sourceFile); System.out.println("XML file parsed"); return doc; diff --git a/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/AnyElementTest.java b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/AnyElementTest.java new file mode 100644 index 00000000000..f37f0bfab28 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/AnyElementTest.java @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please 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.validation; + +/* + * @bug 8080907 + * @summary Test processContents attribute of any element + */ +import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI; + +import java.net.URISyntaxException; + +import javax.xml.transform.stream.StreamSource; + +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import org.xml.sax.SAXException; +import org.xml.sax.SAXParseException; + +public class AnyElementTest { + @BeforeClass + public void setup() throws URISyntaxException, SAXException { + validator = SchemaFactory.newInstance(W3C_XML_SCHEMA_NS_URI).newSchema(new StreamSource(getUri("ProcessContents.xsd"))).newValidator(); + } + + /* + * processContents attribute - Specifies how the XML processor should handle + * validation against the elements specified by this any element. Can be set + * to one of the following: + * strict - the XML processor must obtain the schema for the required + * namespaces and validate the elements (this is default) + * lax - same as strict, but if the schema cannot be obtained, no errors + * will occur + * skip - The XML processor does not attempt to validate any elements from + * the specified namespaces + */ + @Test + public void testProcessContents() throws Exception { + validator.validate(new StreamSource(getUri("ProcessContents-ok.xml"))); + } + + /* + * When processContents="lax", validation will be performed when the element + * is declared in the schema. + */ + @Test(expectedExceptions = SAXParseException.class) + public void testProcessContentsLax() throws Exception { + validator.validate(new StreamSource(getUri("ProcessContents-lax-error.xml"))); + } + + /* + * Get the URI of the file, which is in the same path as this class + */ + private String getUri(String fileName) throws URISyntaxException { + return this.getClass().getResource(fileName).toURI().toASCIIString(); + } + + private Validator validator; +} diff --git a/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/ProcessContents-lax-error.xml b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/ProcessContents-lax-error.xml new file mode 100644 index 00000000000..b75125f5338 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/ProcessContents-lax-error.xml @@ -0,0 +1,4 @@ + + + 25.5 + \ No newline at end of file diff --git a/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/ProcessContents-ok.xml b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/ProcessContents-ok.xml new file mode 100644 index 00000000000..8c2675ca9a5 --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/ProcessContents-ok.xml @@ -0,0 +1,21 @@ + + + 255 + + 2.55 + + + 25.5 + + + TTT + + + + 2555 + TTT + + 20 + + + diff --git a/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/ProcessContents.xsd b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/ProcessContents.xsd new file mode 100644 index 00000000000..74229b824ff --- /dev/null +++ b/jaxp/test/javax/xml/jaxp/unittest/javax/xml/validation/ProcessContents.xsd @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jaxp/test/javax/xml/jaxp/unittest/org/w3c/dom/ls/LSSerializerTest.java b/jaxp/test/javax/xml/jaxp/unittest/org/w3c/dom/ls/LSSerializerTest.java index 56aafde0bb5..0213f82a0d6 100644 --- a/jaxp/test/javax/xml/jaxp/unittest/org/w3c/dom/ls/LSSerializerTest.java +++ b/jaxp/test/javax/xml/jaxp/unittest/org/w3c/dom/ls/LSSerializerTest.java @@ -44,6 +44,7 @@ import org.xml.sax.SAXException; /* + * @bug 6439439 8080906 * @summary Test LSSerializer. */ public class LSSerializerTest { @@ -98,6 +99,17 @@ public class LSSerializerTest { } } + /* + * @bug 8080906 + * It will fail in a Jigsaw build until JDK-8080266 is fixed. + */ + @Test + public void testDefaultLSSerializer() throws Exception { + DOMImplementationLS domImpl = (DOMImplementationLS) DocumentBuilderFactory.newInstance().newDocumentBuilder().getDOMImplementation(); + LSSerializer lsSerializer = domImpl.createLSSerializer(); + Assert.assertTrue(lsSerializer.getClass().getName().endsWith("dom3.LSSerializerImpl")); + } + @Test public void testDOMErrorHandler() { diff --git a/jaxws/.hgtags b/jaxws/.hgtags index 8dda55983d4..9be6ec92c3e 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -313,3 +313,5 @@ df100399ed27d0eaa57c137ca99819a0fee66178 jdk9-b64 45ef73bb85c12ec1b291835c1d40e342a454e3f0 jdk9-b65 1232f4013417e4a9cd291096798d10f2e601d69d jdk9-b66 c9785bc8ade98a16a050d7520b70c68363857e00 jdk9-b67 +b5878b03d1b2e105917d959fbfa3c57c22495803 jdk9-b68 +f5911c6155c29ac24b6f9068273207e5ebd3a3df jdk9-b69 diff --git a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java index 18ff8196bc7..a0329cf7744 100644 --- a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java +++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ContextFinder.java @@ -68,6 +68,9 @@ class ContextFinder { */ private static final String PLATFORM_DEFAULT_FACTORY_CLASS = "com.sun.xml.internal.bind.v2.ContextFactory"; + // previous value of JAXBContext.JAXB_CONTEXT_FACTORY, using also this to ensure backwards compatibility + private static final String JAXB_CONTEXT_FACTORY_DEPRECATED = "javax.xml.bind.context.factory"; + private static final Logger logger; static { @@ -92,6 +95,14 @@ class ContextFinder { } } + private static ServiceLoaderUtil.ExceptionHandler EXCEPTION_HANDLER = + new ServiceLoaderUtil.ExceptionHandler() { + @Override + public JAXBException createException(Throwable throwable, String message) { + return new JAXBException(message, throwable); + } + }; + /** * If the {@link InvocationTargetException} wraps an exception that shouldn't be wrapped, * throw the wrapped exception. @@ -159,7 +170,10 @@ class ContextFinder { } } - static JAXBContext newInstance(String contextPath, Class spFactory, ClassLoader classLoader, Map properties) throws JAXBException { + static JAXBContext newInstance(String contextPath, + Class spFactory, + ClassLoader classLoader, + Map properties) throws JAXBException { try { /* @@ -239,6 +253,7 @@ class ContextFinder { Map properties, Class spFactory) throws JAXBException { try { + Method m = spFactory.getMethod("createContext", Class[].class, Map.class); Object context = m.invoke(null, classes, properties); if (!(context instanceof JAXBContext)) { @@ -246,10 +261,10 @@ class ContextFinder { throw handleClassCastException(context.getClass(), JAXBContext.class); } return (JAXBContext) context; - } catch (NoSuchMethodException e) { - throw new JAXBException(e); - } catch (IllegalAccessException e) { + + } catch (NoSuchMethodException | IllegalAccessException e) { throw new JAXBException(e); + } catch (InvocationTargetException e) { handleInvocationTargetException(e); @@ -261,9 +276,10 @@ class ContextFinder { } } - static JAXBContext find(String factoryId, String contextPath, ClassLoader classLoader, Map properties) throws JAXBException { - - // TODO: do we want/need another layer of searching in $java.home/lib/jaxb.properties like JAXP? + static JAXBContext find(String factoryId, + String contextPath, + ClassLoader classLoader, + Map properties) throws JAXBException { StringTokenizer packages = new StringTokenizer(contextPath, ":"); if (!packages.hasMoreTokens()) { @@ -275,63 +291,85 @@ class ContextFinder { logger.fine("Searching jaxb.properties"); while (packages.hasMoreTokens()) { // com.acme.foo - > com/acme/foo/jaxb.properties - String className = classNameFromPackageProperties(factoryId, classLoader, packages.nextToken(":").replace('.', '/')); - if (className != null) return newInstance(contextPath, className, classLoader, properties); + String factoryClassName = + classNameFromPackageProperties( + classLoader, + packages.nextToken(":").replace('.', '/'), + factoryId, + JAXB_CONTEXT_FACTORY_DEPRECATED); + + if (factoryClassName != null) { + return newInstance(contextPath, factoryClassName, classLoader, properties); + } } String factoryName = classNameFromSystemProperties(); if (factoryName != null) return newInstance(contextPath, factoryName, classLoader, properties); - Class ctxFactory = (Class) ServiceLoaderUtil.lookupUsingOSGiServiceLoader("javax.xml.bind.JAXBContext", logger); + JAXBContextFactory obj = ServiceLoaderUtil.firstByServiceLoader( + JAXBContextFactory.class, logger, EXCEPTION_HANDLER); + + if (obj != null) return obj.createContext(contextPath, classLoader, properties); + + // to ensure backwards compatibility + factoryName = firstByServiceLoaderDeprecated(JAXBContext.class, classLoader); + if (factoryName != null) return newInstance(contextPath, factoryName, classLoader, properties); + + Class ctxFactory = (Class) ServiceLoaderUtil.lookupUsingOSGiServiceLoader( + "javax.xml.bind.JAXBContext", logger); + if (ctxFactory != null) { return newInstance(contextPath, ctxFactory, classLoader, properties); } - // TODO: SPEC change required! This is supposed to be! - // JAXBContext obj = firstByServiceLoader(JAXBContext.class, EXCEPTION_HANDLER); - // if (obj != null) return obj; - - // TODO: Deprecated - SPEC change required! - factoryName = firstByServiceLoaderDeprecated(JAXBContext.class, classLoader); - if (factoryName != null) return newInstance(contextPath, factoryName, classLoader, properties); - // else no provider found logger.fine("Trying to create the platform default provider"); return newInstance(contextPath, PLATFORM_DEFAULT_FACTORY_CLASS, classLoader, properties); } - static JAXBContext find(Class[] classes, Map properties) throws JAXBException { + static JAXBContext find(Class[] classes, Map properties) throws JAXBException { // search for jaxb.properties in the class loader of each class first logger.fine("Searching jaxb.properties"); for (final Class c : classes) { // this classloader is used only to load jaxb.properties, so doing this should be safe. - if (c.getPackage() == null) continue; // this is possible for primitives, arrays, and classes that are loaded by poorly implemented ClassLoaders + // this is possible for primitives, arrays, and classes that are + // loaded by poorly implemented ClassLoaders + if (c.getPackage() == null) continue; // TODO: do we want to optimize away searching the same package? org.Foo, org.Bar, com.Baz // classes from the same package might come from different class loades, so it might be a bad idea // TODO: it's easier to look things up from the class // c.getResourceAsStream("jaxb.properties"); - String className = classNameFromPackageProperties(JAXBContext.JAXB_CONTEXT_FACTORY, getClassClassLoader(c), c.getPackage().getName().replace('.', '/')); - if (className != null) return newInstance(classes, properties, className); + String factoryClassName = + classNameFromPackageProperties( + getClassClassLoader(c), + c.getPackage().getName().replace('.', '/'), + JAXBContext.JAXB_CONTEXT_FACTORY, JAXB_CONTEXT_FACTORY_DEPRECATED); + + if (factoryClassName != null) return newInstance(classes, properties, factoryClassName); } - String factoryName = classNameFromSystemProperties(); - if (factoryName != null) return newInstance(classes, properties, factoryName); + String factoryClassName = classNameFromSystemProperties(); + if (factoryClassName != null) return newInstance(classes, properties, factoryClassName); - Class ctxFactoryClass = (Class) ServiceLoaderUtil.lookupUsingOSGiServiceLoader("javax.xml.bind.JAXBContext", logger); - if (ctxFactoryClass != null) { - return newInstance(classes, properties, ctxFactoryClass); - } + JAXBContextFactory factory = + ServiceLoaderUtil.firstByServiceLoader(JAXBContextFactory.class, logger, EXCEPTION_HANDLER); - // TODO: to be removed - deprecated!!! Requires SPEC change!!! + if (factory != null) return factory.createContext(classes, properties); + + // to ensure backwards compatibility String className = firstByServiceLoaderDeprecated(JAXBContext.class, getContextClassLoader()); if (className != null) return newInstance(classes, properties, className); - // // TODO: supposed to be: - // obj = firstByServiceLoader(JAXBContext.class, EXCEPTION_HANDLER); - // if (obj != null) return obj; + logger.fine("Trying to create the platform default provider"); + Class ctxFactoryClass = + (Class) ServiceLoaderUtil.lookupUsingOSGiServiceLoader("javax.xml.bind.JAXBContext", logger); + + if (ctxFactoryClass != null) { + return newInstance(classes, properties, ctxFactoryClass); + } // else no provider found logger.fine("Trying to create the platform default provider"); @@ -339,42 +377,69 @@ class ContextFinder { } - private static String classNameFromPackageProperties(String factoryId, ClassLoader classLoader, String packageName) throws JAXBException { + /** + * first factoryId should be the preffered one, + * more of those can be provided to support backwards compatibility + */ + private static String classNameFromPackageProperties(ClassLoader classLoader, + String packageName, + String ... factoryIds) throws JAXBException { + String resourceName = packageName + "/jaxb.properties"; logger.log(Level.FINE, "Trying to locate {0}", resourceName); Properties props = loadJAXBProperties(classLoader, resourceName); if (props != null) { - if (props.containsKey(factoryId)) { - return props.getProperty(factoryId); - } else { - throw new JAXBException(Messages.format(Messages.MISSING_PROPERTY, packageName, factoryId)); + for(String factoryId : factoryIds) { + if (props.containsKey(factoryId)) { + return props.getProperty(factoryId); + } } + throw new JAXBException(Messages.format(Messages.MISSING_PROPERTY, packageName, factoryIds[0])); } return null; } private static String classNameFromSystemProperties() throws JAXBException { - logger.log(Level.FINE, "Checking system property {0}", JAXBContext.JAXB_CONTEXT_FACTORY); - // search for a system property second (javax.xml.bind.JAXBContext) - String factoryClassName = AccessController.doPrivileged(new GetPropertyAction(JAXBContext.JAXB_CONTEXT_FACTORY)); + + String factoryClassName = getSystemProperty(JAXBContext.JAXB_CONTEXT_FACTORY); + if (factoryClassName != null) { + return factoryClassName; + } + // leave this here to assure compatibility + factoryClassName = getDeprecatedSystemProperty(JAXB_CONTEXT_FACTORY_DEPRECATED); + if (factoryClassName != null) { + return factoryClassName; + } + // leave this here to assure compatibility + factoryClassName = getDeprecatedSystemProperty(JAXBContext.class.getName()); if (factoryClassName != null) { - logger.log(Level.FINE, " found {0}", factoryClassName); return factoryClassName; - } else { // leave this here to assure compatibility - logger.fine(" not found"); - logger.log(Level.FINE, "Checking system property {0}", JAXBContext.class.getName()); - factoryClassName = AccessController.doPrivileged(new GetPropertyAction(JAXBContext.class.getName())); - if (factoryClassName != null) { - logger.log(Level.FINE, " found {0}", factoryClassName); - return factoryClassName; - } else { - logger.fine(" not found"); - } } return null; } - private static Properties loadJAXBProperties(ClassLoader classLoader, String propFileName) throws JAXBException { + private static String getDeprecatedSystemProperty(String property) { + String value = getSystemProperty(property); + if (value != null) { + logger.log(Level.WARNING, "Using non-standard property: {0}. Property {1} should be used instead.", + new Object[] {property, JAXBContext.JAXB_CONTEXT_FACTORY}); + } + return value; + } + + private static String getSystemProperty(String property) { + logger.log(Level.FINE, "Checking system property {0}", property); + String value = AccessController.doPrivileged(new GetPropertyAction(property)); + if (value != null) { + logger.log(Level.FINE, " found {0}", value); + } else { + logger.log(Level.FINE, " not found"); + } + return value; + } + + private static Properties loadJAXBProperties(ClassLoader classLoader, + String propFileName) throws JAXBException { Properties props = null; try { @@ -480,17 +545,18 @@ class ContextFinder { } } - // TODO: to be removed - SPEC change required - // ServiceLoaderUtil.firstByServiceLoaderDeprecated should be used instead. + // ServiceLoaderUtil.firstByServiceLoaderDeprecated should be used instead. @Deprecated - static String firstByServiceLoaderDeprecated(Class spiClass, ClassLoader classLoader) throws JAXBException { + static String firstByServiceLoaderDeprecated(Class spiClass, + ClassLoader classLoader) throws JAXBException { + final String jaxbContextFQCN = spiClass.getName(); logger.fine("Searching META-INF/services"); // search META-INF services next BufferedReader r = null; - final String resource = new StringBuilder().append("META-INF/services/").append(jaxbContextFQCN).toString(); + final String resource = "META-INF/services/" + jaxbContextFQCN; try { final InputStream resourceStream = (classLoader == null) ? @@ -510,9 +576,6 @@ class ContextFinder { logger.log(Level.FINE, "Unable to load:{0}", resource); return null; } - } catch (UnsupportedEncodingException e) { - // should never happen - throw new JAXBException(e); } catch (IOException e) { throw new JAXBException(e); } finally { diff --git a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContext.java b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContext.java index d5dc7bc4a5e..376b6738cb5 100644 --- a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContext.java +++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContext.java @@ -45,29 +45,20 @@ import java.io.InputStream; * specialized forms of the method available: * *

* - *

- * SPEC REQUIREMENT: the provider must supply an implementation - * class containing the following method signatures: - * - *

{@code
- * public static JAXBContext createContext( String contextPath, ClassLoader classLoader, Map properties ) throws JAXBException
- * public static JAXBContext createContext( Class[] classes, Map properties ) throws JAXBException
- * }
- * *

* The following JAXB 1.0 requirement is only required for schema to * java interface/implementation binding. It does not apply to JAXB annotated @@ -109,11 +100,11 @@ import java.io.InputStream; * any of the schemas listed in the contextPath. For example: * *

- *        JAXBContext jc = JAXBContext.newInstance( "com.acme.foo:com.acme.bar" );
- *        Unmarshaller u = jc.createUnmarshaller();
- *        FooObject fooObj = (FooObject)u.unmarshal( new File( "foo.xml" ) ); // ok
- *        BarObject barObj = (BarObject)u.unmarshal( new File( "bar.xml" ) ); // ok
- *        BazObject bazObj = (BazObject)u.unmarshal( new File( "baz.xml" ) ); // error, "com.acme.baz" not in contextPath
+ *      JAXBContext jc = JAXBContext.newInstance( "com.acme.foo:com.acme.bar" );
+ *      Unmarshaller u = jc.createUnmarshaller();
+ *      FooObject fooObj = (FooObject)u.unmarshal( new File( "foo.xml" ) ); // ok
+ *      BarObject barObj = (BarObject)u.unmarshal( new File( "bar.xml" ) ); // ok
+ *      BazObject bazObj = (BazObject)u.unmarshal( new File( "baz.xml" ) ); // error, "com.acme.baz" not in contextPath
  * 
* *

@@ -146,7 +137,7 @@ import java.io.InputStream; * Section 4.2 Java Package of the specification. * *

- * SPEC REQUIREMENT: the provider must generate a class in each + * The provider must generate a class in each * package that contains all of the necessary object factory methods for that * package named ObjectFactory as well as the static * newInstance( javaContentInterface ) method @@ -214,6 +205,7 @@ import java.io.InputStream; * by the following steps. * *

    + * *
  1. * For each package/class explicitly passed in to the {@link #newInstance} method, in the order they are specified, * jaxb.properties file is looked up in its package, by using the associated classloader — @@ -223,7 +215,7 @@ import java.io.InputStream; *

    * If such a file is discovered, it is {@link Properties#load(InputStream) loaded} as a property file, and * the value of the {@link #JAXB_CONTEXT_FACTORY} key will be assumed to be the provider factory class. - * This class is then loaded by the associated classloader discussed above. + * This class is then loaded by the associated class loader discussed above. * *

    * This phase of the look up allows some packages to force the use of a certain JAXB implementation. @@ -234,10 +226,36 @@ import java.io.InputStream; * factory class. This phase of the look up enables per-JVM override of the JAXB implementation. * *

  2. - * Look for /META-INF/services/javax.xml.bind.JAXBContext file in the associated classloader. - * This file follows the standard service descriptor convention, and if such a file exists, its content - * is assumed to be the provider factory class. This phase of the look up is for automatic discovery. - * It allows users to just put a JAXB implementation in a classpath and use it without any furhter configuration. + * Provider of {@link javax.xml.bind.JAXBContextFactory} is loaded using the service-provider loading + * facilities, defined by the {@link java.util.ServiceLoader} class, to attempt + * to locate and load an implementation of the service using the {@linkplain + * java.util.ServiceLoader#load(java.lang.Class) default loading mechanism}: the service-provider loading facility + * will use the {@linkplain java.lang.Thread#getContextClassLoader() current thread's context class loader} + * to attempt to load the context factory. If the context class loader is null, the + * {@linkplain ClassLoader#getSystemClassLoader() system class loader} will be used. + *
    + * In case of {@link java.util.ServiceConfigurationError service + * configuration error} a {@link javax.xml.bind.JAXBException} will be thrown. + *
  3. + * + *
  4. + * Look for resource {@code /META-INF/services/javax.xml.bind.JAXBContext} using provided class loader. + * Methods without class loader parameter use {@code Thread.currentThread().getContextClassLoader()}. + * If such a resource exists, its content is assumed to be the provider factory class and must supply + * an implementation class containing the following method signatures: + * + *
    + *
    + * public static JAXBContext createContext(
    + *                                      String contextPath,
    + *                                      ClassLoader classLoader,
    + *                                      Map<String,Object> properties throws JAXBException
    + *
    + * public static JAXBContext createContext(
    + *                                      Class[] classes,
    + *                                      Map<String,Object> properties ) throws JAXBException
    + * 
    + * This configuration method is deprecated. * *
  5. * Finally, if all the steps above fail, then the rest of the look up is unspecified. That said, @@ -246,17 +264,30 @@ import java.io.InputStream; *
* *

- * Once the provider factory class is discovered, its - * public static JAXBContext createContext(String,ClassLoader,Map) method - * (see {@link #newInstance(String, ClassLoader, Map)} for the parameter semantics.) - * or public static JAXBContext createContet(Class[],Map) method - * (see {@link #newInstance(Class[], Map)} for the parameter semantics) are invoked + * Once the provider factory class {@link javax.xml.bind.JAXBContextFactory} is discovered, one of its methods + * {@link javax.xml.bind.JAXBContextFactory#createContext(String, ClassLoader, java.util.Map)} or + * {@link javax.xml.bind.JAXBContextFactory#createContext(Class[], java.util.Map)} is invoked * to create a {@link JAXBContext}. * - * @author

+ *

+ * + * @apiNote + *

Service discovery method using file /META-INF/services/javax.xml.bind.JAXBContext (described in step 4) + * and leveraging provider's static methods is supported only to allow backwards compatibility, but it is strongly + * recommended to migrate to standard ServiceLoader mechanism (described in step 3). + * + * @implNote + * Within the last step, if Glassfish AS environment detected, its specific service loader is used to find factory class. + * + * @author

+ * * @see Marshaller * @see Unmarshaller - * @see S 7.4.1 "Named Packages" in Java Language Specification + * @see S 7.4.1 "Named Packages" + * in Java Language Specification + * * @since 1.6, JAXB 1.0 */ public abstract class JAXBContext { @@ -265,9 +296,7 @@ public abstract class JAXBContext { * The name of the property that contains the name of the class capable * of creating new JAXBContext objects. */ - public static final String JAXB_CONTEXT_FACTORY = - "javax.xml.bind.context.factory"; - + public static final String JAXB_CONTEXT_FACTORY = "javax.xml.bind.JAXBContextFactory"; protected JAXBContext() { } @@ -275,7 +304,7 @@ public abstract class JAXBContext { /** *

- * Obtain a new instance of a JAXBContext class. + * Create a new instance of a JAXBContext class. * *

* This is a convenience method to invoke the @@ -300,7 +329,7 @@ public abstract class JAXBContext { /** *

- * Obtain a new instance of a JAXBContext class. + * Create a new instance of a JAXBContext class. * *

* The client application must supply a context path which is a list of @@ -396,7 +425,7 @@ public abstract class JAXBContext { /** *

- * Obtain a new instance of a JAXBContext class. + * Create a new instance of a JAXBContext class. * *

* This is mostly the same as {@link JAXBContext#newInstance(String, ClassLoader)}, @@ -425,8 +454,9 @@ public abstract class JAXBContext { * * @since 1.6, JAXB 2.0 */ - public static JAXBContext newInstance( String contextPath, ClassLoader classLoader, Map properties ) - throws JAXBException { + public static JAXBContext newInstance( String contextPath, + ClassLoader classLoader, + Map properties ) throws JAXBException { return ContextFinder.find( /* The default property name according to the JAXB spec */ @@ -443,7 +473,7 @@ public abstract class JAXBContext { // TODO: resurrect this once we introduce external annotations // /** // *

-// * Obtain a new instance of a JAXBContext class. +// * Create a new instance of a JAXBContext class. // * // *

// * The client application must supply a list of classes that the new @@ -479,7 +509,7 @@ public abstract class JAXBContext { // * spec-defined classes will be returned. // * // * @return -// * A new instance of a JAXBContext. Always non-null valid object. +// * A new instance of a JAXBContext. // * // * @throws JAXBException // * if an error was encountered while creating the @@ -517,7 +547,7 @@ public abstract class JAXBContext { /** *

- * Obtain a new instance of a JAXBContext class. + * Create a new instance of a JAXBContext class. * *

* The client application must supply a list of classes that the new @@ -559,7 +589,7 @@ public abstract class JAXBContext { * spec-defined classes will be returned. * * @return - * A new instance of a JAXBContext. Always non-null valid object. + * A new instance of a JAXBContext. * * @throws JAXBException * if an error was encountered while creating the @@ -578,7 +608,7 @@ public abstract class JAXBContext { * * @since 1.6, JAXB 2.0 */ - public static JAXBContext newInstance( Class... classesToBeBound ) + public static JAXBContext newInstance( Class ... classesToBeBound ) throws JAXBException { return newInstance(classesToBeBound,Collections.emptyMap()); @@ -586,7 +616,7 @@ public abstract class JAXBContext { /** *

- * Obtain a new instance of a JAXBContext class. + * Create a new instance of a JAXBContext class. * *

* An overloading of {@link JAXBContext#newInstance(Class...)} @@ -605,7 +635,7 @@ public abstract class JAXBContext { * in an empty map. * * @return - * A new instance of a JAXBContext. Always non-null valid object. + * A new instance of a JAXBContext. * * @throws JAXBException * if an error was encountered while creating the @@ -624,7 +654,7 @@ public abstract class JAXBContext { * * @since 1.6, JAXB 2.0 */ - public static JAXBContext newInstance( Class[] classesToBeBound, Map properties ) + public static JAXBContext newInstance( Class[] classesToBeBound, Map properties ) throws JAXBException { if (classesToBeBound == null) { @@ -756,9 +786,9 @@ public abstract class JAXBContext { if (System.getSecurityManager() == null) { return Thread.currentThread().getContextClassLoader(); } else { - return (ClassLoader) java.security.AccessController.doPrivileged( - new java.security.PrivilegedAction() { - public java.lang.Object run() { + return java.security.AccessController.doPrivileged( + new java.security.PrivilegedAction() { + public ClassLoader run() { return Thread.currentThread().getContextClassLoader(); } }); diff --git a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContextFactory.java b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContextFactory.java new file mode 100644 index 00000000000..9353f37ad3c --- /dev/null +++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/JAXBContextFactory.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package javax.xml.bind; + +import java.util.Map; + +/** + *

Factory that creates new JAXBContext instances. + * + * JAXBContextFactory can be located using {@link java.util.ServiceLoader#load(Class)} + * + * @since 1.9, JAXB 2.3 + */ +public interface JAXBContextFactory { + + /** + *

+ * Create a new instance of a JAXBContext class. + * + *

+ * For semantics see {@link javax.xml.bind.JAXBContext#newInstance(Class[], java.util.Map)} + * + * @param classesToBeBound + * list of java classes to be recognized by the new {@link JAXBContext}. + * Can be empty, in which case a {@link JAXBContext} that only knows about + * spec-defined classes will be returned. + * @param properties + * provider-specific properties. Can be null, which means the same thing as passing + * in an empty map. + * + * @return + * A new instance of a JAXBContext. + * + * @throws JAXBException + * if an error was encountered while creating the + * JAXBContext, such as (but not limited to): + *

    + *
  1. Classes use JAXB annotations incorrectly + *
  2. Classes have colliding annotations (i.e., two classes with the same type name) + *
  3. The JAXB implementation was unable to locate + * provider-specific out-of-band information (such as additional + * files generated at the development time.) + *
+ * + * @throws IllegalArgumentException + * if the parameter contains {@code null} (i.e., {@code newInstance(null,someMap);}) + * + * @since 1.9, JAXB 2.3 + */ + JAXBContext createContext(Class[] classesToBeBound, + Map properties ) throws JAXBException; + + /** + *

+ * Create a new instance of a JAXBContext class. + * + *

+ * For semantics see {@link javax.xml.bind.JAXBContext#newInstance(String, ClassLoader, java.util.Map)} + * + *

+ * The interpretation of properties is up to implementations. Implementations should + * throw JAXBException if it finds properties that it doesn't understand. + * + * @param contextPath list of java package names that contain schema derived classes + * @param classLoader + * This class loader will be used to locate the implementation classes. + * @param properties + * provider-specific properties. Can be null, which means the same thing as passing + * in an empty map. + * + * @return a new instance of a JAXBContext + * @throws JAXBException if an error was encountered while creating the + * JAXBContext such as + *

    + *
  1. failure to locate either ObjectFactory.class or jaxb.index in the packages
  2. + *
  3. an ambiguity among global elements contained in the contextPath
  4. + *
  5. failure to locate a value for the context factory provider property
  6. + *
  7. mixing schema derived packages from different providers on the same contextPath
  8. + *
+ * @since 1.9, JAXB 2.3 + */ + JAXBContext createContext(String contextPath, + ClassLoader classLoader, + Map properties ) throws JAXBException; + +} diff --git a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ServiceLoaderUtil.java b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ServiceLoaderUtil.java index 159a7c13ca5..0efc25f2061 100644 --- a/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ServiceLoaderUtil.java +++ b/jaxws/src/java.xml.bind/share/classes/javax/xml/bind/ServiceLoaderUtil.java @@ -25,14 +25,9 @@ package javax.xml.bind; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.util.Iterator; -import java.util.Properties; import java.util.ServiceLoader; import java.util.logging.Level; import java.util.logging.Logger; @@ -49,27 +44,27 @@ class ServiceLoaderUtil { private static final String OSGI_SERVICE_LOADER_CLASS_NAME = "com.sun.org.glassfish.hk2.osgiresourcelocator.ServiceLoader"; private static final String OSGI_SERVICE_LOADER_METHOD_NAME = "lookupProviderClasses"; - static

P firstByServiceLoader(Class

spiClass, Logger logger) { + static P firstByServiceLoader(Class

spiClass, + Logger logger, + ExceptionHandler handler) throws T { // service discovery - ServiceLoader

serviceLoader = ServiceLoader.load(spiClass); - for (P impl : serviceLoader) { - logger.fine("ServiceProvider loading Facility used; returning object [" + impl.getClass().getName() + "]"); - return impl; + try { + ServiceLoader

serviceLoader = ServiceLoader.load(spiClass); + + for (P impl : serviceLoader) { + logger.fine("ServiceProvider loading Facility used; returning object [" + + impl.getClass().getName() + "]"); + + return impl; + } + } catch (Throwable t) { + throw handler.createException(t, "Error while searching for service [" + spiClass.getName() + "]"); } return null; } - static boolean isOsgi(Logger logger) { - try { - Class.forName(OSGI_SERVICE_LOADER_CLASS_NAME); - return true; - } catch (ClassNotFoundException ignored) { - logger.log(Level.FINE, "OSGi classes not found, OSGi not available.", ignored); - } - return false; - } - static Object lookupUsingOSGiServiceLoader(String factoryId, Logger logger) { + try { // Use reflection to avoid having any dependendcy on ServiceLoader class Class serviceClass = Class.forName(factoryId); @@ -78,39 +73,22 @@ class ServiceLoaderUtil { Iterator iter = ((Iterable) m.invoke(null, serviceClass)).iterator(); if (iter.hasNext()) { Object next = iter.next(); - logger.fine("Found implementation using OSGi facility; returning object [" + next.getClass().getName() + "]."); + logger.fine("Found implementation using OSGi facility; returning object [" + + next.getClass().getName() + "]."); return next; } else { return null; } - } catch (Exception ignored) { + } catch (IllegalAccessException | + InvocationTargetException | + ClassNotFoundException | + NoSuchMethodException ignored) { + logger.log(Level.FINE, "Unable to find from OSGi: [" + factoryId + "]", ignored); return null; } } - static String propertyFileLookup(final String configFullPath, final String factoryId) throws IOException { - File f = new File(configFullPath); - String factoryClassName = null; - if (f.exists()) { - Properties props = new Properties(); - FileInputStream stream = null; - try { - stream = new FileInputStream(f); - props.load(stream); - factoryClassName = props.getProperty(factoryId); - } finally { - if (stream != null) { - try { - stream.close(); - } catch (IOException ignored) { - } - } - } - } - return factoryClassName; - } - static void checkPackageAccess(String className) { // make sure that the current thread has an access to the package of the given name. SecurityManager s = System.getSecurityManager(); @@ -130,18 +108,12 @@ class ServiceLoaderUtil { } } - /** - * Returns instance of required class. It checks package access (security) unless it is defaultClassname. It means if you - * are trying to instantiate default implementation (fallback), pass the class name to both first and second parameter. - * - * @param className class to be instantiated - * @param isDefaultClassname says whether default implementation class - * @param handler exception handler - necessary for wrapping exceptions and logging - * @param Type of exception being thrown (necessary to distinguish between Runtime and checked exceptions) - * @return instantiated object or throws Runtime/checked exception, depending on ExceptionHandler's type - * @throws T - */ - static Object newInstance(String className, String defaultImplClassName, final ExceptionHandler handler) throws T { + // Returns instance of required class. It checks package access (security) + // unless it is defaultClassname. It means if you are trying to instantiate + // default implementation (fallback), pass the class name to both first and second parameter. + static Object newInstance(String className, + String defaultImplClassName, + final ExceptionHandler handler) throws T { try { return safeLoadClass(className, defaultImplClassName, contextClassLoader(handler)).newInstance(); } catch (ClassNotFoundException x) { @@ -151,7 +123,10 @@ class ServiceLoaderUtil { } } - static Class safeLoadClass(String className, String defaultImplClassName, ClassLoader classLoader) throws ClassNotFoundException { + static Class safeLoadClass(String className, + String defaultImplClassName, + ClassLoader classLoader) throws ClassNotFoundException { + try { checkPackageAccess(className); } catch (SecurityException se) { @@ -165,16 +140,6 @@ class ServiceLoaderUtil { return nullSafeLoadClass(className, classLoader); } - static String getJavaHomeLibConfigPath(String filename) { - String javah = AccessController.doPrivileged(new PrivilegedAction() { - @Override - public String run() { - return System.getProperty("java.home"); - } - }); - return javah + File.separator + "lib" + File.separator + filename; - } - static ClassLoader contextClassLoader(ExceptionHandler exceptionHandler) throws Exception { try { return Thread.currentThread().getContextClassLoader(); diff --git a/jdk/.hgtags b/jdk/.hgtags index 768fb1cb36b..dff033ae106 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -310,3 +310,5 @@ fd3281c400347088b36aeb16273aa679d53a81a4 jdk9-b63 ed94f3e7ba6bbfec0772de6d24e39543e13f6d88 jdk9-b65 4fbcca8ab812198c7fb747ea7b213b6e404f36e9 jdk9-b66 1abd45df5480a04bff98fba1851d66a5230e67d4 jdk9-b67 +046fd17bb9a0cdf6681124866df9626d17b0516a jdk9-b68 +551323004d0ce2f1d4b0e99552f7e0cdcebc6fca jdk9-b69 diff --git a/jdk/make/lib/Awt2dLibraries.gmk b/jdk/make/lib/Awt2dLibraries.gmk index 177fe2ad594..211620ec3a6 100644 --- a/jdk/make/lib/Awt2dLibraries.gmk +++ b/jdk/make/lib/Awt2dLibraries.gmk @@ -54,7 +54,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBMLIB_IMAGE, \ OPTIMIZATION := HIGHEST, \ CFLAGS := $(CFLAGS_JDKLIB) \ $(BUILD_LIBMLIB_CFLAGS), \ - DISABLED_WARNINGS_gcc := parentheses, \ + DISABLED_WARNINGS_gcc := parentheses array-bounds, \ DISABLED_WARNINGS_clang := parentheses, \ DISABLED_WARNINGS_solstudio := E_STATEMENT_NOT_REACHED, \ MAPFILE := $(BUILD_LIBMLIB_IMAGE_MAPFILE), \ @@ -491,10 +491,10 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJAVAJPEG, \ SRC := $(LIBJAVAJPEG_SRC), \ INCLUDE_FILES := $(BUILD_LIBJAVAJPEG_INCLUDE_FILES), \ OPTIMIZATION := HIGHEST, \ - CFLAGS := $(CFLAGS_JDKLIB) $(addprefix -I, $(LIBJAVAJPEG_SRC)) \ + CFLAGS := $(CFLAGS_JDKLIB) $(BUILD_LIBJAVAJPEG_HEADERS) \ $(LIBJAVA_HEADER_FLAGS) \ -I$(SUPPORT_OUTPUTDIR)/headers/java.desktop, \ - DISABLED_WARNINGS_gcc := clobbered parentheses, \ + DISABLED_WARNINGS_gcc := clobbered parentheses array-bounds, \ DISABLED_WARNINGS_clang := logical-op-parentheses, \ DISABLED_WARNINGS_microsoft := 4267, \ MAPFILE := $(BUILD_LIBJAVAJPEG_MAPFILE), \ diff --git a/jdk/make/lib/Lib-java.instrument.gmk b/jdk/make/lib/Lib-java.instrument.gmk index b0eb7e858db..ed40a831896 100644 --- a/jdk/make/lib/Lib-java.instrument.gmk +++ b/jdk/make/lib/Lib-java.instrument.gmk @@ -61,7 +61,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBINSTRUMENT, \ OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \ SRC := $(LIBINSTRUMENT_SRC), \ OPTIMIZATION := LOW, \ - CFLAGS := $(LIBINSTRUMENT_CFLAGS) $(CFLAGS_WARNINGS_ARE_ERRORS), \ + CFLAGS := $(LIBINSTRUMENT_CFLAGS), \ CFLAGS_debug := -DJPLIS_LOGGING, \ CFLAGS_release := -DNO_JPLIS_LOGGING, \ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libinstrument/mapfile-vers, \ diff --git a/jdk/make/lib/Lib-java.management.gmk b/jdk/make/lib/Lib-java.management.gmk index b0062445341..9f5aaaed3a9 100644 --- a/jdk/make/lib/Lib-java.management.gmk +++ b/jdk/make/lib/Lib-java.management.gmk @@ -50,7 +50,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBMANAGEMENT, \ OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \ SRC := $(LIBMANAGEMENT_SRC), \ OPTIMIZATION := $(LIBMANAGEMENT_OPTIMIZATION), \ - CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) $(LIBMANAGEMENT_CFLAGS), \ + CFLAGS := $(CFLAGS_JDKLIB) $(LIBMANAGEMENT_CFLAGS), \ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libmanagement/mapfile-vers, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ diff --git a/jdk/make/lib/Lib-jdk.attach.gmk b/jdk/make/lib/Lib-jdk.attach.gmk index dbabea5b733..d1bdd5e1bc0 100644 --- a/jdk/make/lib/Lib-jdk.attach.gmk +++ b/jdk/make/lib/Lib-jdk.attach.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBATTACH, \ OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \ SRC := $(call FindSrcDirsForLib, jdk.attach, attach), \ OPTIMIZATION := LOW, \ - CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) \ + CFLAGS := $(CFLAGS_JDKLIB) \ -I$(SUPPORT_OUTPUTDIR)/headers/jdk.attach \ $(LIBJAVA_HEADER_FLAGS) $(LIBATTACH_CFLAGS), \ CFLAGS_windows := /Gy, \ diff --git a/jdk/make/lib/Lib-jdk.hprof.agent.gmk b/jdk/make/lib/Lib-jdk.hprof.agent.gmk index 7c43331b33c..c6d1bbd1d04 100644 --- a/jdk/make/lib/Lib-jdk.hprof.agent.gmk +++ b/jdk/make/lib/Lib-jdk.hprof.agent.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,7 @@ BUILD_LIBHPROF_SRC := $(call FindSrcDirsForLib, jdk.hprof.agent, hprof) BUILD_LIBHPROF_CFLAGS := $(addprefix -I, $(BUILD_LIBHPROF_SRC)) \ -I$(JDK_TOPDIR)/src/demo/share/jvmti/java_crw_demo - + BUILD_LIBHPROF_LDFLAGS := LIBHPROF_OPTIMIZATION := HIGHEST @@ -46,7 +46,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBHPROF, \ OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \ SRC := $(BUILD_LIBHPROF_SRC), \ OPTIMIZATION := $(LIBHPROF_OPTIMIZATION), \ - CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) \ + CFLAGS := $(CFLAGS_JDKLIB) \ $(BUILD_LIBHPROF_CFLAGS), \ CFLAGS_debug := -DHPROF_LOGGING, \ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libhprof/mapfile-vers, \ @@ -75,7 +75,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJAVA_CRW_DEMO, \ OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \ SRC := $(LIBJAVA_CRW_DEMO_SRC), \ OPTIMIZATION := LOW, \ - CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) \ + CFLAGS := $(CFLAGS_JDKLIB) \ $(addprefix -I, $(LIBJAVA_CRW_DEMO_SRC)), \ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjava_crw_demo/mapfile-vers, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ diff --git a/jdk/make/lib/Lib-jdk.jdi.gmk b/jdk/make/lib/Lib-jdk.jdi.gmk index eb1de3b43c1..74d246f50d4 100644 --- a/jdk/make/lib/Lib-jdk.jdi.gmk +++ b/jdk/make/lib/Lib-jdk.jdi.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -44,7 +44,7 @@ ifeq ($(OPENJDK_TARGET_OS), windows) OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \ SRC := $(LIBDT_SHMEM_SRC), \ OPTIMIZATION := LOW, \ - CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) -DUSE_MMAP \ + CFLAGS := $(CFLAGS_JDKLIB) -DUSE_MMAP \ $(LIBDT_SHMEM_CPPFLAGS), \ LDFLAGS := $(LDFLAGS_JDKLIB), \ LDFLAGS_windows := -export:jdwpTransport_OnLoad, \ diff --git a/jdk/make/lib/Lib-jdk.jdwp.agent.gmk b/jdk/make/lib/Lib-jdk.jdwp.agent.gmk index 0743ac85a97..03a1d3e3965 100644 --- a/jdk/make/lib/Lib-jdk.jdwp.agent.gmk +++ b/jdk/make/lib/Lib-jdk.jdwp.agent.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -41,7 +41,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBDT_SOCKET, \ OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \ SRC := $(LIBDT_SOCKET_SRC), \ OPTIMIZATION := LOW, \ - CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_CFLAGS_WARNINGS_ARE_ERRORS) -DUSE_MMAP \ + CFLAGS := $(CFLAGS_JDKLIB) -DUSE_MMAP \ $(LIBDT_SOCKET_CPPFLAGS), \ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libdt_socket/mapfile-vers, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ @@ -77,7 +77,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJDWP, \ OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \ SRC := $(LIBJDWP_SRC), \ OPTIMIZATION := LOW, \ - CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) -DJDWP_LOGGING \ + CFLAGS := $(CFLAGS_JDKLIB) -DJDWP_LOGGING \ $(LIBJDWP_CPPFLAGS) \ -I$(SUPPORT_OUTPUTDIR)/headers/jdk.jdwp.agent, \ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libjdwp/mapfile-vers, \ diff --git a/jdk/make/lib/Lib-jdk.management.gmk b/jdk/make/lib/Lib-jdk.management.gmk index 84e71f7060c..8950738b453 100644 --- a/jdk/make/lib/Lib-jdk.management.gmk +++ b/jdk/make/lib/Lib-jdk.management.gmk @@ -59,7 +59,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBMANAGEMENT_EXT, \ SRC := $(LIBMANAGEMENT_EXT_SRC), \ LANG := C, \ OPTIMIZATION := $(LIBMANAGEMENT_EXT_OPTIMIZATION), \ - CFLAGS := $(CFLAGS_JDKLIB) $(CFLAGS_WARNINGS_ARE_ERRORS) $(LIBMANAGEMENT_EXT_CFLAGS), \ + CFLAGS := $(CFLAGS_JDKLIB) $(LIBMANAGEMENT_EXT_CFLAGS), \ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libmanagement_ext/mapfile-vers, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ diff --git a/jdk/make/lib/Lib-jdk.sctp.gmk b/jdk/make/lib/Lib-jdk.sctp.gmk index 15db8b3b380..dff84900595 100644 --- a/jdk/make/lib/Lib-jdk.sctp.gmk +++ b/jdk/make/lib/Lib-jdk.sctp.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -30,12 +30,8 @@ include LibCommon.gmk ifeq ($(OPENJDK_TARGET_OS_TYPE), unix) ifeq (, $(filter $(OPENJDK_TARGET_OS), macosx aix)) - - # Suppress unused parameters required by exported JNI functions. - SCTP_WERROR := -Werror -Wno-error=unused-parameter - ifeq ($(OPENJDK_TARGET_CPU_ARCH), ppc) - SCTP_WERROR := - endif + # DISABLED_WARNINGS_gcc := unused-parameter needed to + # suppress unused parameters required by exported JNI functions. $(eval $(call SetupNativeCompilation,BUILD_LIBSCTP, \ LIBRARY := sctp, \ @@ -49,7 +45,7 @@ ifeq ($(OPENJDK_TARGET_OS_TYPE), unix) $(LIBJAVA_HEADER_FLAGS) \ -I$(SUPPORT_OUTPUTDIR)/headers/jdk.sctp \ -I$(SUPPORT_OUTPUTDIR)/headers/java.base, \ - CFLAGS_linux := $(SCTP_WERROR), \ + DISABLED_WARNINGS_gcc := unused-parameter, \ MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libsctp/mapfile-vers, \ LDFLAGS := $(LDFLAGS_JDKLIB) \ $(call SET_SHARED_LIBRARY_ORIGIN), \ diff --git a/jdk/make/mapfiles/libjava/mapfile-vers b/jdk/make/mapfiles/libjava/mapfile-vers index cc406fa6e7a..855ac081431 100644 --- a/jdk/make/mapfiles/libjava/mapfile-vers +++ b/jdk/make/mapfiles/libjava/mapfile-vers @@ -129,11 +129,11 @@ SUNWprivate_1.1 { Java_java_lang_ClassLoader_defineClass0; Java_java_lang_ClassLoader_defineClass1; Java_java_lang_ClassLoader_defineClass2; + Java_java_lang_ClassLoader_findBuiltinLib; Java_java_lang_ClassLoader_findLoadedClass0; Java_java_lang_ClassLoader_00024NativeLibrary_find; Java_java_lang_ClassLoader_00024NativeLibrary_load; Java_java_lang_ClassLoader_00024NativeLibrary_unload; - Java_java_lang_ClassLoader_00024NativeLibrary_findBuiltinLib; Java_java_lang_ClassLoader_registerNatives; Java_java_lang_Double_longBitsToDouble; Java_java_lang_Double_doubleToRawLongBits; diff --git a/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContext.java b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContext.java index f2533dd7f0c..d917c056f98 100644 --- a/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContext.java +++ b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContext.java @@ -58,7 +58,7 @@ public class SSLContext { * * @param contextSpi the delegate * @param provider the provider - * @param algorithm the algorithm + * @param protocol the protocol */ protected SSLContext(SSLContextSpi contextSpi, Provider provider, String protocol) { diff --git a/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContextSpi.java b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContextSpi.java index cbb002675f9..3f2e74e8236 100644 --- a/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContextSpi.java +++ b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLContextSpi.java @@ -49,9 +49,9 @@ public abstract class SSLContextSpi { /** * Initializes this context. * - * @param km the sources of authentication keys - * @param tm the sources of peer authentication trust decisions - * @param random the source of randomness for this generator + * @param ah the sources of authentication keys + * @param th the sources of peer authentication trust decisions + * @param sr the source of randomness for this generator */ protected abstract void engineInit(KeyManager[] ah, TrustManager[] th, SecureRandom sr) throws KeyManagementException; diff --git a/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLPermission.java b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLPermission.java index 2bf9233051b..8f8c249d007 100644 --- a/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLPermission.java +++ b/jdk/src/java.base/share/classes/com/sun/net/ssl/SSLPermission.java @@ -52,7 +52,6 @@ import java.lang.SecurityManager; * The following table lists all the possible SSLPermission target names, * and for each provides a description of what the permission allows * and a discussion of the risks of granting code the permission. - *

* * * diff --git a/jdk/src/java.base/share/classes/java/io/File.java b/jdk/src/java.base/share/classes/java/io/File.java index 5aa6b200163..c2ae4400c77 100644 --- a/jdk/src/java.base/share/classes/java/io/File.java +++ b/jdk/src/java.base/share/classes/java/io/File.java @@ -2148,7 +2148,7 @@ public class File * WriteObject is called to save this filename. * The separator character is saved also so it can be replaced * in case the path is reconstituted on a different host type. - *

+ * * @serialData Default fields followed by separator character. */ private synchronized void writeObject(java.io.ObjectOutputStream s) diff --git a/jdk/src/java.base/share/classes/java/io/FilePermission.java b/jdk/src/java.base/share/classes/java/io/FilePermission.java index 0c5bcf35178..e3dc11f4eb5 100644 --- a/jdk/src/java.base/share/classes/java/io/FilePermission.java +++ b/jdk/src/java.base/share/classes/java/io/FilePermission.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,11 +27,9 @@ package java.io; import java.security.*; import java.util.Enumeration; -import java.util.List; -import java.util.ArrayList; -import java.util.Vector; -import java.util.Collections; import java.util.StringJoiner; +import java.util.Vector; +import java.util.concurrent.ConcurrentHashMap; import sun.security.util.SecurityConstants; /** @@ -288,7 +286,6 @@ public final class FilePermission extends Permission implements Serializable { * @param path the pathname of the file/directory. * @param mask the action mask to use. */ - // package private for use by the FilePermissionCollection add method FilePermission(String path, int mask) { super(path); @@ -315,6 +312,7 @@ public final class FilePermission extends Permission implements Serializable { * null and is implied by this object, * false otherwise. */ + @Override public boolean implies(Permission p) { if (!(p instanceof FilePermission)) return false; @@ -387,6 +385,7 @@ public final class FilePermission extends Permission implements Serializable { * pathname and actions as this FilePermission object, * false otherwise. */ + @Override public boolean equals(Object obj) { if (obj == this) return true; @@ -407,6 +406,7 @@ public final class FilePermission extends Permission implements Serializable { * * @return a hash code value for this object. */ + @Override public int hashCode() { return 0; } @@ -587,6 +587,7 @@ public final class FilePermission extends Permission implements Serializable { * * @return the canonical string representation of the actions. */ + @Override public String getActions() { if (actions == null) actions = getActions(this.mask); @@ -625,6 +626,7 @@ public final class FilePermission extends Permission implements Serializable { * @return a new PermissionCollection object suitable for storing * FilePermissions. */ + @Override public PermissionCollection newPermissionCollection() { return new FilePermissionCollection(); } @@ -689,13 +691,13 @@ final class FilePermissionCollection extends PermissionCollection implements Serializable { // Not serialized; see serialization section at end of class - private transient List perms; + private transient ConcurrentHashMap perms; /** * Create an empty FilePermissionCollection object. */ public FilePermissionCollection() { - perms = new ArrayList<>(); + perms = new ConcurrentHashMap<>(); } /** @@ -710,6 +712,7 @@ final class FilePermissionCollection extends PermissionCollection * @exception SecurityException - if this FilePermissionCollection object * has been marked readonly */ + @Override public void add(Permission permission) { if (! (permission instanceof FilePermission)) throw new IllegalArgumentException("invalid permission: "+ @@ -718,9 +721,31 @@ final class FilePermissionCollection extends PermissionCollection throw new SecurityException( "attempt to add a Permission to a readonly PermissionCollection"); - synchronized (this) { - perms.add(permission); - } + FilePermission fp = (FilePermission)permission; + + // Add permission to map if it is absent, or replace with new + // permission if applicable. NOTE: cannot use lambda for + // remappingFunction parameter until JDK-8076596 is fixed. + perms.merge(fp.getName(), fp, + new java.util.function.BiFunction<>() { + @Override + public Permission apply(Permission existingVal, + Permission newVal) { + int oldMask = ((FilePermission)existingVal).getMask(); + int newMask = ((FilePermission)newVal).getMask(); + if (oldMask != newMask) { + int effective = oldMask | newMask; + if (effective == newMask) { + return newVal; + } + if (effective != oldMask) { + return new FilePermission(fp.getName(), effective); + } + } + return existingVal; + } + } + ); } /** @@ -732,26 +757,25 @@ final class FilePermissionCollection extends PermissionCollection * @return true if "permission" is a proper subset of a permission in * the set, false if not. */ + @Override public boolean implies(Permission permission) { if (! (permission instanceof FilePermission)) return false; - FilePermission fp = (FilePermission) permission; + FilePermission fperm = (FilePermission) permission; - int desired = fp.getMask(); + int desired = fperm.getMask(); int effective = 0; int needed = desired; - synchronized (this) { - int len = perms.size(); - for (int i = 0; i < len; i++) { - FilePermission x = (FilePermission) perms.get(i); - if (((needed & x.getMask()) != 0) && x.impliesIgnoreMask(fp)) { - effective |= x.getMask(); - if ((effective & desired) == desired) - return true; - needed = (desired ^ effective); + for (Permission perm : perms.values()) { + FilePermission fp = (FilePermission)perm; + if (((needed & fp.getMask()) != 0) && fp.impliesIgnoreMask(fperm)) { + effective |= fp.getMask(); + if ((effective & desired) == desired) { + return true; } + needed = (desired ^ effective); } } return false; @@ -763,11 +787,9 @@ final class FilePermissionCollection extends PermissionCollection * * @return an enumeration of all the FilePermission objects. */ + @Override public Enumeration elements() { - // Convert Iterator into Enumeration - synchronized (this) { - return Collections.enumeration(perms); - } + return perms.elements(); } private static final long serialVersionUID = 2202956749081564585L; @@ -795,10 +817,7 @@ final class FilePermissionCollection extends PermissionCollection // Don't call out.defaultWriteObject() // Write out Vector - Vector permissions = new Vector<>(perms.size()); - synchronized (this) { - permissions.addAll(perms); - } + Vector permissions = new Vector<>(perms.values()); ObjectOutputStream.PutField pfields = out.putFields(); pfields.put("permissions", permissions); @@ -819,7 +838,9 @@ final class FilePermissionCollection extends PermissionCollection // Get the one we want @SuppressWarnings("unchecked") Vector permissions = (Vector)gfields.get("permissions", null); - perms = new ArrayList<>(permissions.size()); - perms.addAll(permissions); + perms = new ConcurrentHashMap<>(permissions.size()); + for (Permission perm : permissions) { + perms.put(perm.getName(), perm); + } } } diff --git a/jdk/src/java.base/share/classes/java/lang/ClassLoader.java b/jdk/src/java.base/share/classes/java/lang/ClassLoader.java index 295955847ca..2ba6f5d4f0d 100644 --- a/jdk/src/java.base/share/classes/java/lang/ClassLoader.java +++ b/jdk/src/java.base/share/classes/java/lang/ClassLoader.java @@ -1702,7 +1702,6 @@ public abstract class ClassLoader { native long find(String name); native void unload(String name, boolean isBuiltin); - static native String findBuiltinLib(String name); public NativeLibrary(Class fromClass, String name, boolean isBuiltin) { this.name = name; @@ -1861,9 +1860,11 @@ public abstract class ClassLoader { throw new UnsatisfiedLinkError("no " + name + " in java.library.path"); } + static native String findBuiltinLib(String name); + private static boolean loadLibrary0(Class fromClass, final File file) { // Check to see if we're attempting to access a static library - String name = NativeLibrary.findBuiltinLib(file.getName()); + String name = findBuiltinLib(file.getName()); boolean isBuiltin = (name != null); if (!isBuiltin) { name = AccessController.doPrivileged( diff --git a/jdk/src/java.base/share/classes/java/lang/Process.java b/jdk/src/java.base/share/classes/java/lang/Process.java index 7eca3fd4699..88ee5f0f53f 100644 --- a/jdk/src/java.base/share/classes/java/lang/Process.java +++ b/jdk/src/java.base/share/classes/java/lang/Process.java @@ -368,7 +368,7 @@ public abstract class Process { * Processes returned from {@link ProcessBuilder#start} override the * default implementation to provide an efficient mechanism to wait * for process exit. - *

+ * * @apiNote * Using {@link #onExit() onExit} is an alternative to * {@link #waitFor() waitFor} that enables both additional concurrency diff --git a/jdk/src/java.base/share/classes/java/lang/ProcessHandle.java b/jdk/src/java.base/share/classes/java/lang/ProcessHandle.java index f16fbee20b9..1894525c6a2 100644 --- a/jdk/src/java.base/share/classes/java/lang/ProcessHandle.java +++ b/jdk/src/java.base/share/classes/java/lang/ProcessHandle.java @@ -71,7 +71,7 @@ import java.util.stream.Stream; * The ability to control processes is also restricted by the native system, * ProcessHandle provides no more access to, or control over, the native process * than would be allowed by a native application. - *

+ * * @implSpec * In the case where ProcessHandles cannot be supported then the factory * methods must consistently throw {@link java.lang.UnsupportedOperationException}. diff --git a/jdk/src/java.base/share/classes/java/lang/SecurityManager.java b/jdk/src/java.base/share/classes/java/lang/SecurityManager.java index 7f1e90d6c04..4560219fe8e 100644 --- a/jdk/src/java.base/share/classes/java/lang/SecurityManager.java +++ b/jdk/src/java.base/share/classes/java/lang/SecurityManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1447,7 +1447,7 @@ class SecurityManager { throw new NullPointerException("package name can't be null"); } - String[] pkgs; + String[] restrictedPkgs; synchronized (packageAccessLock) { /* * Do we need to update our property array? @@ -1457,8 +1457,7 @@ class SecurityManager { AccessController.doPrivileged( new PrivilegedAction<>() { public String run() { - return java.security.Security.getProperty( - "package.access"); + return Security.getProperty("package.access"); } } ); @@ -1468,14 +1467,33 @@ class SecurityManager { // Using a snapshot of packageAccess -- don't care if static field // changes afterwards; array contents won't change. - pkgs = packageAccess; + restrictedPkgs = packageAccess; } /* * Traverse the list of packages, check for any matches. */ - for (String restrictedPkg : pkgs) { - if (pkg.startsWith(restrictedPkg) || restrictedPkg.equals(pkg + ".")) { + final int plen = pkg.length(); + for (String restrictedPkg : restrictedPkgs) { + final int rlast = restrictedPkg.length() - 1; + + // Optimizations: + // + // If rlast >= plen then restrictedPkg is longer than pkg by at + // least one char. This means pkg cannot start with restrictedPkg, + // since restrictedPkg will be longer than pkg. + // + // Similarly if rlast != plen, then pkg + "." cannot be the same + // as restrictedPkg, since pkg + "." will have a different length + // than restrictedPkg. + // + if (rlast < plen && pkg.startsWith(restrictedPkg) || + // The following test is equivalent to + // restrictedPkg.equals(pkg + ".") but is noticeably more + // efficient: + rlast == plen && restrictedPkg.startsWith(pkg) && + restrictedPkg.charAt(rlast) == '.') + { checkPermission( new RuntimePermission("accessClassInPackage." + pkg)); break; // No need to continue; only need to check this once diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java b/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java index 11e452b96c9..13cf24ca0f2 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/CallSite.java @@ -27,8 +27,6 @@ package java.lang.invoke; import static java.lang.invoke.MethodHandleStatics.*; import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; -import java.lang.reflect.Field; -import sun.misc.Cleaner; /** * A {@code CallSite} is a holder for a variable {@link MethodHandle}, @@ -138,47 +136,9 @@ public class CallSite { /** * {@code CallSite} dependency context. - * VM uses context class to store nmethod dependencies on the call site target. - * Can be in 2 states: (a) null; or (b) {@code Cleaner} instance pointing to some Class instance. - * Lazily initialized when CallSite instance is linked to some indy call site or VM needs - * it to store dependencies. As a corollary, "null" context means there are no dependencies - * registered yet. {@code Cleaner} is used in 2 roles: - * (a) context class access for VM; - * (b) stale context class cleanup. - * {@code Cleaner} holds the context class until cleanup action is finished (see {@code PhantomReference}). - * Though it's impossible to get the context class using {@code Reference.get()}, VM extracts it directly - * from {@code Reference.referent} field. + * JVM uses CallSite.context to store nmethod dependencies on the call site target. */ - private volatile Cleaner context = null; - - /** - * Default context. - * VM uses it to initialize non-linked CallSite context. - */ - private static class DefaultContext {} - private static final Cleaner DEFAULT_CONTEXT = makeContext(DefaultContext.class, null); - - private static Cleaner makeContext(Class referent, final CallSite holder) { - return Cleaner.create(referent, - new Runnable() { - @Override public void run() { - MethodHandleNatives.invalidateDependentNMethods(holder); - } - }); - } - - /** Initialize context class used for nmethod dependency tracking */ - /*package-private*/ - void initContext(Class newContext) { - // If there are concurrent actions, exactly one succeeds. - if (context == null) { - UNSAFE.compareAndSwapObject(this, CONTEXT_OFFSET, /*expected=*/null, makeContext(newContext, this)); - // No need to care about failed CAS attempt. - // Since initContext is called from indy call site linkage in newContext class, there's no risk - // that the context class becomes dead while corresponding context cleaner is alive (causing cleanup - // action in the wrong context). - } - } + private final MethodHandleNatives.CallSiteContext context = MethodHandleNatives.CallSiteContext.make(this); /** * Returns the type of this call site's target. diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java index 3d3c47f689c..b53b44b99b1 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleNatives.java @@ -30,6 +30,7 @@ import java.lang.reflect.Field; import static java.lang.invoke.MethodHandleNatives.Constants.*; import static java.lang.invoke.MethodHandleStatics.*; import static java.lang.invoke.MethodHandles.Lookup.IMPL_LOOKUP; +import sun.misc.Cleaner; /** * The JVM interface for the method handles package is all here. @@ -61,8 +62,27 @@ class MethodHandleNatives { static native void setCallSiteTargetNormal(CallSite site, MethodHandle target); static native void setCallSiteTargetVolatile(CallSite site, MethodHandle target); - /** Invalidate CallSite context: clean up dependent nmethods and reset call site context to initial state (null). */ - static native void invalidateDependentNMethods(CallSite site); + /** Represents a context to track nmethod dependencies on CallSite instance target. */ + static class CallSiteContext implements Runnable { + //@Injected JVM_nmethodBucket* vmdependencies; + + static CallSiteContext make(CallSite cs) { + final CallSiteContext newContext = new CallSiteContext(); + // Cleaner is attached to CallSite instance and it clears native structures allocated for CallSite context. + // Though the CallSite can become unreachable, its Context is retained by the Cleaner instance (which is + // referenced from Cleaner class) until cleanup is performed. + Cleaner.create(cs, newContext); + return newContext; + } + + @Override + public void run() { + MethodHandleNatives.clearCallSiteContext(this); + } + } + + /** Invalidate all recorded nmethods. */ + private static native void clearCallSiteContext(CallSiteContext context); private static native void registerNatives(); static { @@ -235,7 +255,6 @@ class MethodHandleNatives { return Invokers.linkToTargetMethod(type); } else { appendixResult[0] = callSite; - callSite.initContext(caller); return Invokers.linkToCallSiteMethod(type); } } diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedArrayType.java b/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedArrayType.java index f92b51d6ff6..3a10a9a63bc 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedArrayType.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedArrayType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,6 +39,7 @@ public interface AnnotatedArrayType extends AnnotatedType { * Returns the potentially annotated generic component type of this array type. * * @return the potentially annotated generic component type of this array type + * @see GenericArrayType#getGenericComponentType() */ AnnotatedType getAnnotatedGenericComponentType(); } diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedParameterizedType.java b/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedParameterizedType.java index f1d43c9528e..b0ca3faa314 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedParameterizedType.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedParameterizedType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * 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 @@ public interface AnnotatedParameterizedType extends AnnotatedType { * Returns the potentially annotated actual type arguments of this parameterized type. * * @return the potentially annotated actual type arguments of this parameterized type + * @see ParameterizedType#getActualTypeArguments() */ AnnotatedType[] getAnnotatedActualTypeArguments(); } diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedTypeVariable.java b/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedTypeVariable.java index 7a39bae492d..9b62bf46dc5 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedTypeVariable.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedTypeVariable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * 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,8 +36,11 @@ public interface AnnotatedTypeVariable extends AnnotatedType { /** * Returns the potentially annotated bounds of this type variable. + * If no bound is explicitly declared, the bound is unannotated + * {@code Object}. * * @return the potentially annotated bounds of this type variable + * @see TypeVariable#getBounds() */ AnnotatedType[] getAnnotatedBounds(); } diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedWildcardType.java b/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedWildcardType.java index 2d15f6c9770..a620516096e 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedWildcardType.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/AnnotatedWildcardType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * 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,15 +36,22 @@ public interface AnnotatedWildcardType extends AnnotatedType { /** * Returns the potentially annotated lower bounds of this wildcard type. + * If no lower bound is explicitly declared, the lower bound is the + * type of null. In this case, a zero length array is returned. * - * @return the potentially annotated lower bounds of this wildcard type + * @return the potentially annotated lower bounds of this wildcard type or + * an empty array if no lower bound is explicitly declared. + * @see WildcardType#getLowerBounds() */ AnnotatedType[] getAnnotatedLowerBounds(); /** * Returns the potentially annotated upper bounds of this wildcard type. + * If no upper bound is explicitly declared, the upper bound is + * unannotated {@code Object} * * @return the potentially annotated upper bounds of this wildcard type + * @see WildcardType#getUpperBounds() */ AnnotatedType[] getAnnotatedUpperBounds(); } diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/TypeVariable.java b/jdk/src/java.base/share/classes/java/lang/reflect/TypeVariable.java index 39ffe4bf3c0..e2e98ee02a2 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/TypeVariable.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/TypeVariable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,7 +51,7 @@ package java.lang.reflect; public interface TypeVariable extends Type, AnnotatedElement { /** * Returns an array of {@code Type} objects representing the - * upper bound(s) of this type variable. Note that if no upper bound is + * upper bound(s) of this type variable. If no upper bound is * explicitly declared, the upper bound is {@code Object}. * *

For each upper bound B:

  • if B is a parameterized @@ -67,7 +67,7 @@ public interface TypeVariable extends Type, Annota * for any reason * @return an array of {@code Type}s representing the upper * bound(s) of this type variable - */ + */ Type[] getBounds(); /** @@ -91,11 +91,11 @@ public interface TypeVariable extends Type, Annota * Returns an array of AnnotatedType objects that represent the use of * types to denote the upper bounds of the type parameter represented by * this TypeVariable. The order of the objects in the array corresponds to - * the order of the bounds in the declaration of the type parameter. + * the order of the bounds in the declaration of the type parameter. Note that + * if no upper bound is explicitly declared, the upper bound is unannotated + * {@code Object}. * - * Returns an array of length 0 if the type parameter declares no bounds. - * - * @return an array of objects representing the upper bounds of the type variable + * @return an array of objects representing the upper bound(s) of the type variable * @since 1.8 */ AnnotatedType[] getAnnotatedBounds(); diff --git a/jdk/src/java.base/share/classes/java/lang/reflect/WildcardType.java b/jdk/src/java.base/share/classes/java/lang/reflect/WildcardType.java index aa8e824d88a..7b8f3962514 100644 --- a/jdk/src/java.base/share/classes/java/lang/reflect/WildcardType.java +++ b/jdk/src/java.base/share/classes/java/lang/reflect/WildcardType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,7 +34,7 @@ package java.lang.reflect; public interface WildcardType extends Type { /** * Returns an array of {@code Type} objects representing the upper - * bound(s) of this type variable. Note that if no upper bound is + * bound(s) of this type variable. If no upper bound is * explicitly declared, the upper bound is {@code Object}. * *

    For each upper bound B : @@ -57,7 +57,7 @@ public interface WildcardType extends Type { /** * Returns an array of {@code Type} objects representing the - * lower bound(s) of this type variable. Note that if no lower bound is + * lower bound(s) of this type variable. If no lower bound is * explicitly declared, the lower bound is the type of {@code null}. * In this case, a zero length array is returned. * diff --git a/jdk/src/java.base/share/classes/java/math/BigInteger.java b/jdk/src/java.base/share/classes/java/math/BigInteger.java index 3690bea06b4..3b3cbf50739 100644 --- a/jdk/src/java.base/share/classes/java/math/BigInteger.java +++ b/jdk/src/java.base/share/classes/java/math/BigInteger.java @@ -1963,6 +1963,43 @@ public class BigInteger extends Number implements Comparable { * int array z. The contents of x are not changed. */ private static final int[] squareToLen(int[] x, int len, int[] z) { + int zlen = len << 1; + if (z == null || z.length < zlen) + z = new int[zlen]; + + // Execute checks before calling intrinsified method. + implSquareToLenChecks(x, len, z, zlen); + return implSquareToLen(x, len, z, zlen); + } + + /** + * Parameters validation. + */ + private static void implSquareToLenChecks(int[] x, int len, int[] z, int zlen) throws RuntimeException { + if (len < 1) { + throw new IllegalArgumentException("invalid input length: " + len); + } + if (len > x.length) { + throw new IllegalArgumentException("input length out of bound: " + + len + " > " + x.length); + } + if (len * 2 > z.length) { + throw new IllegalArgumentException("input length out of bound: " + + (len * 2) + " > " + z.length); + } + if (zlen < 1) { + throw new IllegalArgumentException("invalid input length: " + zlen); + } + if (zlen > z.length) { + throw new IllegalArgumentException("input length out of bound: " + + len + " > " + z.length); + } + } + + /** + * Java Runtime may use intrinsic for this method. + */ + private static final int[] implSquareToLen(int[] x, int len, int[] z, int zlen) { /* * The algorithm used here is adapted from Colin Plumb's C library. * Technique: Consider the partial products in the multiplication @@ -1997,9 +2034,6 @@ public class BigInteger extends Number implements Comparable { * again. The low bit is simply a copy of the low bit of the * input, so it doesn't need special care. */ - int zlen = len << 1; - if (z == null || z.length < zlen) - z = new int[zlen]; // Store the squares, right shifted one bit (i.e., divided by 2) int lastProductLowWord = 0; @@ -2857,6 +2891,32 @@ public class BigInteger extends Number implements Comparable { * Multiply an array by one word k and add to result, return the carry */ static int mulAdd(int[] out, int[] in, int offset, int len, int k) { + implMulAddCheck(out, in, offset, len, k); + return implMulAdd(out, in, offset, len, k); + } + + /** + * Parameters validation. + */ + private static void implMulAddCheck(int[] out, int[] in, int offset, int len, int k) { + if (len > in.length) { + throw new IllegalArgumentException("input length is out of bound: " + len + " > " + in.length); + } + if (offset < 0) { + throw new IllegalArgumentException("input offset is invalid: " + offset); + } + if (offset > (out.length - 1)) { + throw new IllegalArgumentException("input offset is out of bound: " + offset + " > " + (out.length - 1)); + } + if (len > (out.length - offset)) { + throw new IllegalArgumentException("input len is out of bound: " + len + " > " + (out.length - offset)); + } + } + + /** + * Java Runtime may use intrinsic for this method. + */ + private static int implMulAdd(int[] out, int[] in, int offset, int len, int k) { long kLong = k & LONG_MASK; long carry = 0; diff --git a/jdk/src/java.base/share/classes/java/net/SocketPermission.java b/jdk/src/java.base/share/classes/java/net/SocketPermission.java index 52c71b0f7a3..eb046b7122a 100644 --- a/jdk/src/java.base/share/classes/java/net/SocketPermission.java +++ b/jdk/src/java.base/share/classes/java/net/SocketPermission.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,24 +25,24 @@ package java.net; -import java.util.Enumeration; -import java.util.Vector; -import java.util.List; -import java.util.ArrayList; -import java.util.Collections; -import java.util.StringJoiner; -import java.util.StringTokenizer; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamField; +import java.io.Serializable; import java.net.InetAddress; +import java.security.AccessController; import java.security.Permission; import java.security.PermissionCollection; import java.security.PrivilegedAction; -import java.security.AccessController; import java.security.Security; -import java.io.Serializable; -import java.io.ObjectStreamField; -import java.io.ObjectOutputStream; -import java.io.ObjectInputStream; -import java.io.IOException; +import java.util.Collections; +import java.util.Comparator; +import java.util.Enumeration; +import java.util.Vector; +import java.util.StringJoiner; +import java.util.StringTokenizer; +import java.util.concurrent.ConcurrentSkipListMap; import sun.net.util.IPAddressUtil; import sun.net.RegisteredDomain; import sun.net.PortConfig; @@ -832,6 +832,7 @@ public final class SocketPermission extends Permission * @return true if the specified permission is implied by this object, * false if not. */ + @Override public boolean implies(Permission p) { int i,j; @@ -1010,6 +1011,7 @@ public final class SocketPermission extends Permission * SocketPermission object. However, port range will be ignored * in the comparison if obj only contains the action, 'resolve'. */ + @Override public boolean equals(Object obj) { if (obj == this) return true; @@ -1069,7 +1071,7 @@ public final class SocketPermission extends Permission * * @return a hash code value for this object. */ - + @Override public int hashCode() { /* * If this SocketPermission was initialized with an IP address @@ -1137,6 +1139,7 @@ public final class SocketPermission extends Permission * * @return the canonical string representation of the actions. */ + @Override public String getActions() { if (actions == null) @@ -1156,7 +1159,7 @@ public final class SocketPermission extends Permission * * @return a new PermissionCollection object suitable for storing SocketPermissions. */ - + @Override public PermissionCollection newPermissionCollection() { return new SocketPermissionCollection(); } @@ -1320,15 +1323,16 @@ final class SocketPermissionCollection extends PermissionCollection implements Serializable { // Not serialized; see serialization section at end of class - private transient List perms; + // A ConcurrentSkipListMap is used to preserve order, so that most + // recently added permissions are checked first (see JDK-4301064). + private transient ConcurrentSkipListMap perms; /** * Create an empty SocketPermissions object. * */ - public SocketPermissionCollection() { - perms = new ArrayList<>(); + perms = new ConcurrentSkipListMap<>(new SPCComparator()); } /** @@ -1343,6 +1347,7 @@ final class SocketPermissionCollection extends PermissionCollection * @exception SecurityException - if this SocketPermissionCollection object * has been marked readonly */ + @Override public void add(Permission permission) { if (! (permission instanceof SocketPermission)) throw new IllegalArgumentException("invalid permission: "+ @@ -1351,11 +1356,32 @@ final class SocketPermissionCollection extends PermissionCollection throw new SecurityException( "attempt to add a Permission to a readonly PermissionCollection"); - // optimization to ensure perms most likely to be tested - // show up early (4301064) - synchronized (this) { - perms.add(0, (SocketPermission)permission); - } + SocketPermission sp = (SocketPermission)permission; + + // Add permission to map if it is absent, or replace with new + // permission if applicable. NOTE: cannot use lambda for + // remappingFunction parameter until JDK-8076596 is fixed. + perms.merge(sp.getName(), sp, + new java.util.function.BiFunction<>() { + @Override + public SocketPermission apply(SocketPermission existingVal, + SocketPermission newVal) { + int oldMask = existingVal.getMask(); + int newMask = newVal.getMask(); + if (oldMask != newMask) { + int effective = oldMask | newMask; + if (effective == newMask) { + return newVal; + } + if (effective != oldMask) { + return new SocketPermission(sp.getName(), + effective); + } + } + return existingVal; + } + } + ); } /** @@ -1367,7 +1393,7 @@ final class SocketPermissionCollection extends PermissionCollection * @return true if "permission" is a proper subset of a permission in * the collection, false if not. */ - + @Override public boolean implies(Permission permission) { if (! (permission instanceof SocketPermission)) @@ -1379,18 +1405,15 @@ final class SocketPermissionCollection extends PermissionCollection int effective = 0; int needed = desired; - synchronized (this) { - int len = perms.size(); - //System.out.println("implies "+np); - for (int i = 0; i < len; i++) { - SocketPermission x = perms.get(i); - //System.out.println(" trying "+x); - if (((needed & x.getMask()) != 0) && x.impliesIgnoreMask(np)) { - effective |= x.getMask(); - if ((effective & desired) == desired) - return true; - needed = (desired ^ effective); + //System.out.println("implies "+np); + for (SocketPermission x : perms.values()) { + //System.out.println(" trying "+x); + if (((needed & x.getMask()) != 0) && x.impliesIgnoreMask(np)) { + effective |= x.getMask(); + if ((effective & desired) == desired) { + return true; } + needed = (desired ^ effective); } } return false; @@ -1402,13 +1425,10 @@ final class SocketPermissionCollection extends PermissionCollection * * @return an enumeration of all the SocketPermission objects. */ - + @Override @SuppressWarnings("unchecked") public Enumeration elements() { - // Convert Iterator into Enumeration - synchronized (this) { - return Collections.enumeration((List)(List)perms); - } + return (Enumeration)Collections.enumeration(perms.values()); } private static final long serialVersionUID = 2787186408602843674L; @@ -1441,11 +1461,7 @@ final class SocketPermissionCollection extends PermissionCollection // Don't call out.defaultWriteObject() // Write out Vector - Vector permissions = new Vector<>(perms.size()); - - synchronized (this) { - permissions.addAll(perms); - } + Vector permissions = new Vector<>(perms.values()); ObjectOutputStream.PutField pfields = out.putFields(); pfields.put("permissions", permissions); @@ -1466,7 +1482,22 @@ final class SocketPermissionCollection extends PermissionCollection // Get the one we want @SuppressWarnings("unchecked") Vector permissions = (Vector)gfields.get("permissions", null); - perms = new ArrayList<>(permissions.size()); - perms.addAll(permissions); + perms = new ConcurrentSkipListMap<>(new SPCComparator()); + for (SocketPermission sp : permissions) { + perms.put(sp.getName(), sp); + } + } + + /** + * A simple comparator that orders new non-equal entries at the beginning. + */ + private static class SPCComparator implements Comparator { + @Override + public int compare(String s1, String s2) { + if (s1.equals(s2)) { + return 0; + } + return -1; + } } } diff --git a/jdk/src/java.base/share/classes/java/security/BasicPermission.java b/jdk/src/java.base/share/classes/java/security/BasicPermission.java index 92dbe345b26..fb5f2a260a3 100644 --- a/jdk/src/java.base/share/classes/java/security/BasicPermission.java +++ b/jdk/src/java.base/share/classes/java/security/BasicPermission.java @@ -25,15 +25,13 @@ package java.security; -import java.util.Enumeration; -import java.util.Map; -import java.util.HashMap; -import java.util.Hashtable; -import java.util.Collections; -import java.io.ObjectStreamField; -import java.io.ObjectOutputStream; -import java.io.ObjectInputStream; import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamField; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.concurrent.ConcurrentHashMap; /** * The BasicPermission class extends the Permission class, and @@ -165,6 +163,7 @@ public abstract class BasicPermission extends Permission * @return true if the passed permission is equal to or * implied by this permission, false otherwise. */ + @Override public boolean implies(Permission p) { if ((p == null) || (p.getClass() != getClass())) return false; @@ -200,6 +199,7 @@ public abstract class BasicPermission extends Permission * @return true if {@code obj}'s class is the same as this object's class * and has the same name as this BasicPermission object, false otherwise. */ + @Override public boolean equals(Object obj) { if (obj == this) return true; @@ -221,6 +221,7 @@ public abstract class BasicPermission extends Permission * * @return a hash code value for this object. */ + @Override public int hashCode() { return this.getName().hashCode(); } @@ -232,6 +233,7 @@ public abstract class BasicPermission extends Permission * * @return the empty string "". */ + @Override public String getActions() { return ""; } @@ -248,6 +250,7 @@ public abstract class BasicPermission extends Permission * @return a new PermissionCollection object suitable for * storing BasicPermissions. */ + @Override public PermissionCollection newPermissionCollection() { return new BasicPermissionCollection(this.getClass()); } @@ -308,7 +311,7 @@ final class BasicPermissionCollection * collection must be of the same type. * Not serialized; see serialization section at end of class. */ - private transient Map perms; + private transient ConcurrentHashMap perms; /** * This is set to {@code true} if this BasicPermissionCollection @@ -320,7 +323,7 @@ final class BasicPermissionCollection /** * The class to which all BasicPermissions in this - * BasicPermissionCollection belongs. + * BasicPermissionCollection belong. * * @see #serialPersistentFields */ @@ -330,9 +333,8 @@ final class BasicPermissionCollection * Create an empty BasicPermissionCollection object. * */ - public BasicPermissionCollection(Class clazz) { - perms = new HashMap<>(11); + perms = new ConcurrentHashMap<>(11); all_allowed = false; permClass = clazz; } @@ -352,6 +354,7 @@ final class BasicPermissionCollection * @exception SecurityException - if this BasicPermissionCollection object * has been marked readonly */ + @Override public void add(Permission permission) { if (! (permission instanceof BasicPermission)) throw new IllegalArgumentException("invalid permission: "+ @@ -373,13 +376,12 @@ final class BasicPermissionCollection permission); } - synchronized (this) { - perms.put(bp.getCanonicalName(), permission); - } + String canonName = bp.getCanonicalName(); + perms.put(canonName, permission); // No sync on all_allowed; staleness OK if (!all_allowed) { - if (bp.getCanonicalName().equals("*")) + if (canonName.equals("*")) all_allowed = true; } } @@ -393,6 +395,7 @@ final class BasicPermissionCollection * @return true if "permission" is a proper subset of a permission in * the set, false if not. */ + @Override public boolean implies(Permission permission) { if (! (permission instanceof BasicPermission)) return false; @@ -414,11 +417,7 @@ final class BasicPermissionCollection String path = bp.getCanonicalName(); //System.out.println("check "+path); - Permission x; - - synchronized (this) { - x = perms.get(path); - } + Permission x = perms.get(path); if (x != null) { // we have a direct hit! @@ -435,9 +434,7 @@ final class BasicPermissionCollection path = path.substring(0, last+1) + "*"; //System.out.println("check "+path); - synchronized (this) { - x = perms.get(path); - } + x = perms.get(path); if (x != null) { return x.implies(permission); @@ -456,11 +453,9 @@ final class BasicPermissionCollection * * @return an enumeration of all the BasicPermission objects. */ + @Override public Enumeration elements() { - // Convert Iterator of Map values into an Enumeration - synchronized (this) { - return Collections.enumeration(perms.values()); - } + return perms.elements(); } // Need to maintain serialization interoperability with earlier releases, @@ -503,9 +498,7 @@ final class BasicPermissionCollection Hashtable permissions = new Hashtable<>(perms.size()*2); - synchronized (this) { - permissions.putAll(perms); - } + permissions.putAll(perms); // Write out serializable fields ObjectOutputStream.PutField pfields = out.putFields(); @@ -533,7 +526,7 @@ final class BasicPermissionCollection @SuppressWarnings("unchecked") Hashtable permissions = (Hashtable)gfields.get("permissions", null); - perms = new HashMap<>(permissions.size()*2); + perms = new ConcurrentHashMap<>(permissions.size()*2); perms.putAll(permissions); // Get all_allowed diff --git a/jdk/src/java.base/share/classes/java/security/CodeSource.java b/jdk/src/java.base/share/classes/java/security/CodeSource.java index e05c68f9e49..afd3fffd05f 100644 --- a/jdk/src/java.base/share/classes/java/security/CodeSource.java +++ b/jdk/src/java.base/share/classes/java/security/CodeSource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,7 @@ import java.util.Hashtable; import java.io.ByteArrayInputStream; import java.io.IOException; import java.security.cert.*; +import sun.net.util.URLUtil; /** * @@ -72,6 +73,15 @@ public class CodeSource implements java.io.Serializable { // for generating cert paths private transient CertificateFactory factory = null; + /** + * A String form of the URL for use as a key in HashMaps/Sets. The String + * form should be behave in the same manner as the URL when compared for + * equality in a HashMap/Set, except that no nameservice lookup is done + * on the hostname (only string comparison), and the fragment is not + * considered. + */ + private transient String locationNoFragString; + /** * Constructs a CodeSource and associates it with the specified * location and set of certificates. @@ -83,6 +93,9 @@ public class CodeSource implements java.io.Serializable { */ public CodeSource(URL url, java.security.cert.Certificate certs[]) { this.location = url; + if (url != null) { + this.locationNoFragString = URLUtil.urlNoFragString(url); + } // Copy the supplied certs if (certs != null) { @@ -102,6 +115,9 @@ public class CodeSource implements java.io.Serializable { */ public CodeSource(URL url, CodeSigner[] signers) { this.location = url; + if (url != null) { + this.locationNoFragString = URLUtil.urlNoFragString(url); + } // Copy the supplied signers if (signers != null) { @@ -168,6 +184,13 @@ public class CodeSource implements java.io.Serializable { return this.location; } + /** + * Returns a String form of the URL for use as a key in HashMaps/Sets. + */ + String getLocationNoFragString() { + return locationNoFragString; + } + /** * Returns the certificates associated with this CodeSource. *

    @@ -588,6 +611,10 @@ public class CodeSource implements java.io.Serializable { } catch (IOException ioe) { // no signers present } + + if (location != null) { + locationNoFragString = URLUtil.urlNoFragString(location); + } } /* diff --git a/jdk/src/java.base/share/classes/java/security/Permissions.java b/jdk/src/java.base/share/classes/java/security/Permissions.java index 56a5059351b..b9a834a40da 100644 --- a/jdk/src/java.base/share/classes/java/security/Permissions.java +++ b/jdk/src/java.base/share/classes/java/security/Permissions.java @@ -33,6 +33,7 @@ import java.util.HashMap; import java.util.List; import java.util.Iterator; import java.util.Collections; +import java.util.concurrent.ConcurrentHashMap; import java.io.Serializable; import java.io.ObjectStreamField; import java.io.ObjectOutputStream; @@ -85,7 +86,7 @@ implements Serializable * Key is permissions Class, value is PermissionCollection for that class. * Not serialized; see serialization section at end of class. */ - private transient Map, PermissionCollection> permsMap; + private transient ConcurrentHashMap, PermissionCollection> permsMap; // optimization. keep track of whether unresolved permissions need to be // checked @@ -99,7 +100,7 @@ implements Serializable * Creates a new Permissions object containing no PermissionCollections. */ public Permissions() { - permsMap = new HashMap<>(11); + permsMap = new ConcurrentHashMap<>(11); allPermission = null; } @@ -120,18 +121,14 @@ implements Serializable * * @see PermissionCollection#isReadOnly() */ - + @Override public void add(Permission permission) { if (isReadOnly()) throw new SecurityException( "attempt to add a Permission to a readonly Permissions object"); - PermissionCollection pc; - - synchronized (this) { - pc = getPermissionCollection(permission, true); - pc.add(permission); - } + PermissionCollection pc = getPermissionCollection(permission, true); + pc.add(permission); // No sync; staleness -> optimizations delayed, which is OK if (permission instanceof AllPermission) { @@ -169,21 +166,19 @@ implements Serializable * PermissionCollection it * belongs to, false if not. */ - + @Override public boolean implies(Permission permission) { // No sync; staleness -> skip optimization, which is OK if (allPermission != null) { return true; // AllPermission has already been added } else { - synchronized (this) { - PermissionCollection pc = getPermissionCollection(permission, - false); - if (pc != null) { - return pc.implies(permission); - } else { - // none found - return false; - } + PermissionCollection pc = getPermissionCollection(permission, + false); + if (pc != null) { + return pc.implies(permission); + } else { + // none found + return false; } } } @@ -194,14 +189,12 @@ implements Serializable * * @return an enumeration of all the Permissions. */ - + @Override public Enumeration elements() { // go through each Permissions in the hash table // and call their elements() function. - synchronized (this) { - return new PermissionsEnumerator(permsMap.values().iterator()); - } + return new PermissionsEnumerator(permsMap.values().iterator()); } /** @@ -236,34 +229,39 @@ implements Serializable * It should be set to true when invoked from add(). */ private PermissionCollection getPermissionCollection(Permission p, - boolean createEmpty) { + boolean createEmpty) { Class c = p.getClass(); - PermissionCollection pc = permsMap.get(c); - if (!hasUnresolved && !createEmpty) { - return pc; - } else if (pc == null) { - - // Check for unresolved permissions - pc = (hasUnresolved ? getUnresolvedPermissions(p) : null); - - // if still null, create a new collection - if (pc == null && createEmpty) { - - pc = p.newPermissionCollection(); - - // still no PermissionCollection? - // We'll give them a PermissionsHash. - if (pc == null) - pc = new PermissionsHash(); - } - - if (pc != null) { - permsMap.put(c, pc); - } + return permsMap.get(c); } - return pc; + + // Create and add permission collection to map if it is absent. + // NOTE: cannot use lambda for mappingFunction parameter until + // JDK-8076596 is fixed. + return permsMap.computeIfAbsent(c, + new java.util.function.Function<>() { + @Override + public PermissionCollection apply(Class k) { + // Check for unresolved permissions + PermissionCollection pc = + (hasUnresolved ? getUnresolvedPermissions(p) : null); + + // if still null, create a new collection + if (pc == null && createEmpty) { + + pc = p.newPermissionCollection(); + + // still no PermissionCollection? + // We'll give them a PermissionsHash. + if (pc == null) { + pc = new PermissionsHash(); + } + } + return pc; + } + } + ); } /** @@ -277,8 +275,6 @@ implements Serializable */ private PermissionCollection getUnresolvedPermissions(Permission p) { - // Called from within synchronized method so permsMap doesn't need lock - UnresolvedPermissionCollection uc = (UnresolvedPermissionCollection) permsMap.get(UnresolvedPermission.class); @@ -362,9 +358,7 @@ implements Serializable // Copy perms into a Hashtable Hashtable, PermissionCollection> perms = new Hashtable<>(permsMap.size()*2); // no sync; estimate - synchronized (this) { - perms.putAll(permsMap); - } + perms.putAll(permsMap); // Write out serializable fields ObjectOutputStream.PutField pfields = out.putFields(); @@ -394,7 +388,7 @@ implements Serializable @SuppressWarnings("unchecked") Hashtable, PermissionCollection> perms = (Hashtable, PermissionCollection>)gfields.get("perms", null); - permsMap = new HashMap<>(perms.size()*2); + permsMap = new ConcurrentHashMap<>(perms.size()*2); permsMap.putAll(perms); // Set hasUnresolved @@ -481,14 +475,13 @@ implements Serializable * Key and value are (same) permissions objects. * Not serialized; see serialization section at end of class. */ - private transient Map permsMap; + private transient ConcurrentHashMap permsMap; /** * Create an empty PermissionsHash object. */ - PermissionsHash() { - permsMap = new HashMap<>(11); + permsMap = new ConcurrentHashMap<>(11); } /** @@ -496,11 +489,9 @@ implements Serializable * * @param permission the Permission object to add. */ - + @Override public void add(Permission permission) { - synchronized (this) { - permsMap.put(permission, permission); - } + permsMap.put(permission, permission); } /** @@ -512,23 +503,21 @@ implements Serializable * @return true if "permission" is a proper subset of a permission in * the set, false if not. */ - + @Override public boolean implies(Permission permission) { // attempt a fast lookup and implies. If that fails // then enumerate through all the permissions. - synchronized (this) { - Permission p = permsMap.get(permission); + Permission p = permsMap.get(permission); - // If permission is found, then p.equals(permission) - if (p == null) { - for (Permission p_ : permsMap.values()) { - if (p_.implies(permission)) - return true; - } - return false; - } else { - return true; + // If permission is found, then p.equals(permission) + if (p == null) { + for (Permission p_ : permsMap.values()) { + if (p_.implies(permission)) + return true; } + return false; + } else { + return true; } } @@ -537,12 +526,9 @@ implements Serializable * * @return an enumeration of all the Permissions. */ - + @Override public Enumeration elements() { - // Convert Iterator of Map values into an Enumeration - synchronized (this) { - return Collections.enumeration(permsMap.values()); - } + return permsMap.elements(); } private static final long serialVersionUID = -8491988220802933440L; @@ -570,9 +556,7 @@ implements Serializable // Copy perms into a Hashtable Hashtable perms = new Hashtable<>(permsMap.size()*2); - synchronized (this) { - perms.putAll(permsMap); - } + perms.putAll(permsMap); // Write out serializable fields ObjectOutputStream.PutField pfields = out.putFields(); @@ -597,7 +581,7 @@ implements Serializable @SuppressWarnings("unchecked") Hashtable perms = (Hashtable)gfields.get("perms", null); - permsMap = new HashMap<>(perms.size()*2); + permsMap = new ConcurrentHashMap<>(perms.size()*2); permsMap.putAll(perms); } } diff --git a/jdk/src/java.base/share/classes/java/security/SecureClassLoader.java b/jdk/src/java.base/share/classes/java/security/SecureClassLoader.java index 41b84dbe683..56d98363dd9 100644 --- a/jdk/src/java.base/share/classes/java/security/SecureClassLoader.java +++ b/jdk/src/java.base/share/classes/java/security/SecureClassLoader.java @@ -25,9 +25,11 @@ package java.security; -import java.util.HashMap; +import java.util.Map; import java.util.ArrayList; import java.net.URL; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; import sun.security.util.Debug; @@ -47,10 +49,17 @@ public class SecureClassLoader extends ClassLoader { */ private final boolean initialized; - // HashMap that maps CodeSource to ProtectionDomain - // @GuardedBy("pdcache") - private final HashMap pdcache = - new HashMap<>(11); + /* + * Map that maps the CodeSource URL (as a String) to ProtectionDomain. + * We use a String instead of a CodeSource/URL as the key to avoid + * potential expensive name service lookups. This does mean that URLs that + * are equivalent after nameservice lookup will be placed in separate + * ProtectionDomains; however during policy enforcement these URLs will be + * canonicalized and resolved resulting in a consistent set of granted + * permissions. + */ + private final Map pdcache + = new ConcurrentHashMap<>(11); private static final Debug debug = Debug.getInstance("scl"); @@ -196,23 +205,32 @@ public class SecureClassLoader extends ClassLoader { * Returned cached ProtectionDomain for the specified CodeSource. */ private ProtectionDomain getProtectionDomain(CodeSource cs) { - if (cs == null) + if (cs == null) { return null; + } - ProtectionDomain pd = null; - synchronized (pdcache) { - pd = pdcache.get(cs); - if (pd == null) { - PermissionCollection perms = getPermissions(cs); - pd = new ProtectionDomain(cs, perms, this, null); - pdcache.put(cs, pd); + // Use a String form of the URL as the key. It should behave in the + // same manner as the URL when compared for equality except that no + // nameservice lookup is done on the hostname (String comparison + // only), and the fragment is not considered. + String key = cs.getLocationNoFragString(); + if (key == null) { + key = ""; + } + return pdcache.computeIfAbsent(key, new Function<>() { + @Override + public ProtectionDomain apply(String key /* not used */) { + PermissionCollection perms + = SecureClassLoader.this.getPermissions(cs); + ProtectionDomain pd = new ProtectionDomain( + cs, perms, SecureClassLoader.this, null); if (debug != null) { - debug.println(" getPermissions "+ pd); + debug.println(" getPermissions " + pd); debug.println(""); } + return pd; } - } - return pd; + }); } /* diff --git a/jdk/src/java.base/share/classes/java/security/UnresolvedPermissionCollection.java b/jdk/src/java.base/share/classes/java/security/UnresolvedPermissionCollection.java index 87ab32d54f9..5fdc3cbc8e0 100644 --- a/jdk/src/java.base/share/classes/java/security/UnresolvedPermissionCollection.java +++ b/jdk/src/java.base/share/classes/java/security/UnresolvedPermissionCollection.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,13 @@ package java.security; -import java.util.*; -import java.io.ObjectStreamField; -import java.io.ObjectOutputStream; -import java.io.ObjectInputStream; import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamField; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; /** * A UnresolvedPermissionCollection stores a collection @@ -54,14 +56,14 @@ implements java.io.Serializable * of the same type. * Not serialized; see serialization section at end of class. */ - private transient Map> perms; + private transient ConcurrentHashMap> perms; /** * Create an empty UnresolvedPermissionCollection object. * */ public UnresolvedPermissionCollection() { - perms = new HashMap<>(11); + perms = new ConcurrentHashMap<>(11); } /** @@ -70,25 +72,32 @@ implements java.io.Serializable * * @param permission the Permission object to add. */ - - public void add(Permission permission) - { + @Override + public void add(Permission permission) { if (! (permission instanceof UnresolvedPermission)) throw new IllegalArgumentException("invalid permission: "+ permission); UnresolvedPermission up = (UnresolvedPermission) permission; - List v; - synchronized (this) { - v = perms.get(up.getName()); - if (v == null) { - v = new ArrayList<>(); - perms.put(up.getName(), v); + // Add permission to map. NOTE: cannot use lambda for + // remappingFunction parameter until JDK-8076596 is fixed. + perms.compute(up.getName(), + new java.util.function.BiFunction<>() { + @Override + public List apply(String key, + List oldValue) { + if (oldValue == null) { + List v = + new CopyOnWriteArrayList<>(); + v.add(up); + return v; + } else { + oldValue.add(up); + return oldValue; + } + } } - } - synchronized (v) { - v.add(up); - } + ); } /** @@ -96,17 +105,15 @@ implements java.io.Serializable * and return the List containing them. */ List getUnresolvedPermissions(Permission p) { - synchronized (this) { - return perms.get(p.getClass().getName()); - } + return perms.get(p.getClass().getName()); } /** * always returns false for unresolved permissions * */ - public boolean implies(Permission permission) - { + @Override + public boolean implies(Permission permission) { return false; } @@ -116,18 +123,14 @@ implements java.io.Serializable * * @return an enumeration of all the UnresolvedPermission objects. */ - + @Override public Enumeration elements() { List results = new ArrayList<>(); // where results are stored // Get iterator of Map values (which are lists of permissions) - synchronized (this) { - for (List l : perms.values()) { - synchronized (l) { - results.addAll(l); - } - } + for (List l : perms.values()) { + results.addAll(l); } return Collections.enumeration(results); @@ -164,19 +167,14 @@ implements java.io.Serializable new Hashtable<>(perms.size()*2); // Convert each entry (List) into a Vector - synchronized (this) { - Set>> set = perms.entrySet(); - for (Map.Entry> e : set) { - // Convert list into Vector - List list = e.getValue(); - Vector vec = new Vector<>(list.size()); - synchronized (list) { - vec.addAll(list); - } + Set>> set = perms.entrySet(); + for (Map.Entry> e : set) { + // Convert list into Vector + List list = e.getValue(); + Vector vec = new Vector<>(list); - // Add to Hashtable being serialized - permissions.put(e.getKey(), vec); - } + // Add to Hashtable being serialized + permissions.put(e.getKey(), vec); } // Write out serializable fields @@ -203,15 +201,14 @@ implements java.io.Serializable Hashtable> permissions = (Hashtable>) gfields.get("permissions", null); - perms = new HashMap<>(permissions.size()*2); + perms = new ConcurrentHashMap<>(permissions.size()*2); // Convert each entry (Vector) into a List Set>> set = permissions.entrySet(); for (Map.Entry> e : set) { // Convert Vector into ArrayList Vector vec = e.getValue(); - List list = new ArrayList<>(vec.size()); - list.addAll(vec); + List list = new CopyOnWriteArrayList<>(vec); // Add to Hashtable being serialized perms.put(e.getKey(), list); diff --git a/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java b/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java index f76b4028041..84c472f0709 100644 --- a/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java +++ b/jdk/src/java.base/share/classes/java/text/SimpleDateFormat.java @@ -2374,7 +2374,7 @@ public class SimpleDateFormat extends DateFormat { /** * After reading an object from the input stream, the format * pattern in the object is verified. - *

    + * * @exception InvalidObjectException if the pattern is invalid */ private void readObject(ObjectInputStream stream) diff --git a/jdk/src/java.base/share/classes/java/util/DualPivotQuicksort.java b/jdk/src/java.base/share/classes/java/util/DualPivotQuicksort.java index 4682ddee5d8..fbc0359ed37 100644 --- a/jdk/src/java.base/share/classes/java/util/DualPivotQuicksort.java +++ b/jdk/src/java.base/share/classes/java/util/DualPivotQuicksort.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,11 +60,6 @@ final class DualPivotQuicksort { */ private static final int MAX_RUN_COUNT = 67; - /** - * The maximum length of run in merge sort. - */ - private static final int MAX_RUN_LENGTH = 33; - /** * If the length of an array to be sorted is less than this * constant, Quicksort is used in preference to merge sort. @@ -121,20 +116,24 @@ final class DualPivotQuicksort { // Check if the array is nearly sorted for (int k = left; k < right; run[count] = k) { + // Equal items in the beginning of the sequence + while (k < right && a[k] == a[k + 1]) + k++; + if (k == right) break; // Sequence finishes with equal items if (a[k] < a[k + 1]) { // ascending while (++k <= right && a[k - 1] <= a[k]); } else if (a[k] > a[k + 1]) { // descending while (++k <= right && a[k - 1] >= a[k]); + // Transform into an ascending sequence for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) { int t = a[lo]; a[lo] = a[hi]; a[hi] = t; } - } else { // equal - for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) { - if (--m == 0) { - sort(a, left, right, true); - return; - } - } + } + + // Merge a transformed descending sequence followed by an + // ascending sequence + if (run[count] > left && a[run[count]] >= a[run[count] - 1]) { + count--; } /* @@ -151,7 +150,7 @@ final class DualPivotQuicksort { // Implementation note: variable "right" is increased by 1. if (run[count] == right++) { // The last run contains one element run[++count] = right; - } else if (count == 1) { // The array is already sorted + } else if (count <= 1) { // The array is already sorted return; } @@ -569,20 +568,24 @@ final class DualPivotQuicksort { // Check if the array is nearly sorted for (int k = left; k < right; run[count] = k) { + // Equal items in the beginning of the sequence + while (k < right && a[k] == a[k + 1]) + k++; + if (k == right) break; // Sequence finishes with equal items if (a[k] < a[k + 1]) { // ascending while (++k <= right && a[k - 1] <= a[k]); } else if (a[k] > a[k + 1]) { // descending while (++k <= right && a[k - 1] >= a[k]); + // Transform into an ascending sequence for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) { long t = a[lo]; a[lo] = a[hi]; a[hi] = t; } - } else { // equal - for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) { - if (--m == 0) { - sort(a, left, right, true); - return; - } - } + } + + // Merge a transformed descending sequence followed by an + // ascending sequence + if (run[count] > left && a[run[count]] >= a[run[count] - 1]) { + count--; } /* @@ -599,7 +602,7 @@ final class DualPivotQuicksort { // Implementation note: variable "right" is increased by 1. if (run[count] == right++) { // The last run contains one element run[++count] = right; - } else if (count == 1) { // The array is already sorted + } else if (count <= 1) { // The array is already sorted return; } @@ -1053,20 +1056,24 @@ final class DualPivotQuicksort { // Check if the array is nearly sorted for (int k = left; k < right; run[count] = k) { + // Equal items in the beginning of the sequence + while (k < right && a[k] == a[k + 1]) + k++; + if (k == right) break; // Sequence finishes with equal items if (a[k] < a[k + 1]) { // ascending while (++k <= right && a[k - 1] <= a[k]); } else if (a[k] > a[k + 1]) { // descending while (++k <= right && a[k - 1] >= a[k]); + // Transform into an ascending sequence for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) { short t = a[lo]; a[lo] = a[hi]; a[hi] = t; } - } else { // equal - for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) { - if (--m == 0) { - sort(a, left, right, true); - return; - } - } + } + + // Merge a transformed descending sequence followed by an + // ascending sequence + if (run[count] > left && a[run[count]] >= a[run[count] - 1]) { + count--; } /* @@ -1083,7 +1090,7 @@ final class DualPivotQuicksort { // Implementation note: variable "right" is increased by 1. if (run[count] == right++) { // The last run contains one element run[++count] = right; - } else if (count == 1) { // The array is already sorted + } else if (count <= 1) { // The array is already sorted return; } @@ -1537,20 +1544,24 @@ final class DualPivotQuicksort { // Check if the array is nearly sorted for (int k = left; k < right; run[count] = k) { + // Equal items in the beginning of the sequence + while (k < right && a[k] == a[k + 1]) + k++; + if (k == right) break; // Sequence finishes with equal items if (a[k] < a[k + 1]) { // ascending while (++k <= right && a[k - 1] <= a[k]); } else if (a[k] > a[k + 1]) { // descending while (++k <= right && a[k - 1] >= a[k]); + // Transform into an ascending sequence for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) { char t = a[lo]; a[lo] = a[hi]; a[hi] = t; } - } else { // equal - for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) { - if (--m == 0) { - sort(a, left, right, true); - return; - } - } + } + + // Merge a transformed descending sequence followed by an + // ascending sequence + if (run[count] > left && a[run[count]] >= a[run[count] - 1]) { + count--; } /* @@ -1567,7 +1578,7 @@ final class DualPivotQuicksort { // Implementation note: variable "right" is increased by 1. if (run[count] == right++) { // The last run contains one element run[++count] = right; - } else if (count == 1) { // The array is already sorted + } else if (count <= 1) { // The array is already sorted return; } @@ -2117,20 +2128,24 @@ final class DualPivotQuicksort { // Check if the array is nearly sorted for (int k = left; k < right; run[count] = k) { + // Equal items in the beginning of the sequence + while (k < right && a[k] == a[k + 1]) + k++; + if (k == right) break; // Sequence finishes with equal items if (a[k] < a[k + 1]) { // ascending while (++k <= right && a[k - 1] <= a[k]); } else if (a[k] > a[k + 1]) { // descending while (++k <= right && a[k - 1] >= a[k]); + // Transform into an ascending sequence for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) { float t = a[lo]; a[lo] = a[hi]; a[hi] = t; } - } else { // equal - for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) { - if (--m == 0) { - sort(a, left, right, true); - return; - } - } + } + + // Merge a transformed descending sequence followed by an + // ascending sequence + if (run[count] > left && a[run[count]] >= a[run[count] - 1]) { + count--; } /* @@ -2147,7 +2162,7 @@ final class DualPivotQuicksort { // Implementation note: variable "right" is increased by 1. if (run[count] == right++) { // The last run contains one element run[++count] = right; - } else if (count == 1) { // The array is already sorted + } else if (count <= 1) { // The array is already sorted return; } @@ -2656,20 +2671,24 @@ final class DualPivotQuicksort { // Check if the array is nearly sorted for (int k = left; k < right; run[count] = k) { + // Equal items in the beginning of the sequence + while (k < right && a[k] == a[k + 1]) + k++; + if (k == right) break; // Sequence finishes with equal items if (a[k] < a[k + 1]) { // ascending while (++k <= right && a[k - 1] <= a[k]); } else if (a[k] > a[k + 1]) { // descending while (++k <= right && a[k - 1] >= a[k]); + // Transform into an ascending sequence for (int lo = run[count] - 1, hi = k; ++lo < --hi; ) { double t = a[lo]; a[lo] = a[hi]; a[hi] = t; } - } else { // equal - for (int m = MAX_RUN_LENGTH; ++k <= right && a[k - 1] == a[k]; ) { - if (--m == 0) { - sort(a, left, right, true); - return; - } - } + } + + // Merge a transformed descending sequence followed by an + // ascending sequence + if (run[count] > left && a[run[count]] >= a[run[count] - 1]) { + count--; } /* @@ -2686,7 +2705,7 @@ final class DualPivotQuicksort { // Implementation note: variable "right" is increased by 1. if (run[count] == right++) { // The last run contains one element run[++count] = right; - } else if (count == 1) { // The array is already sorted + } else if (count <= 1) { // The array is already sorted return; } diff --git a/jdk/src/java.base/share/classes/java/util/PropertyPermission.java b/jdk/src/java.base/share/classes/java/util/PropertyPermission.java index 7e818a90b64..329e0f94232 100644 --- a/jdk/src/java.base/share/classes/java/util/PropertyPermission.java +++ b/jdk/src/java.base/share/classes/java/util/PropertyPermission.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,18 +25,15 @@ package java.util; -import java.io.Serializable; import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamField; +import java.io.Serializable; import java.security.*; -import java.util.Map; -import java.util.HashMap; import java.util.Enumeration; import java.util.Hashtable; -import java.util.Collections; -import java.io.ObjectStreamField; -import java.io.ObjectOutputStream; -import java.io.ObjectInputStream; -import java.io.IOException; +import java.util.concurrent.ConcurrentHashMap; import sun.security.util.SecurityConstants; /** @@ -161,6 +158,16 @@ public final class PropertyPermission extends BasicPermission { init(getMask(actions)); } + /** + * Creates a PropertyPermission object with the specified name and + * a pre-calculated mask. Avoids the overhead of re-computing the mask. + * Called by PropertyPermissionCollection. + */ + PropertyPermission(String name, int mask) { + super(name, getActions(mask)); + this.mask = mask; + } + /** * Checks if this PropertyPermission object "implies" the specified * permission. @@ -178,6 +185,7 @@ public final class PropertyPermission extends BasicPermission { * @return true if the specified permission is implied by this object, * false if not. */ + @Override public boolean implies(Permission p) { if (!(p instanceof PropertyPermission)) return false; @@ -198,6 +206,7 @@ public final class PropertyPermission extends BasicPermission { * @return true if obj is a PropertyPermission, and has the same name and * actions as this PropertyPermission object. */ + @Override public boolean equals(Object obj) { if (obj == this) return true; @@ -219,6 +228,7 @@ public final class PropertyPermission extends BasicPermission { * * @return a hash code value for this object. */ + @Override public int hashCode() { return this.getName().hashCode(); } @@ -345,6 +355,7 @@ public final class PropertyPermission extends BasicPermission { * * @return the canonical string representation of the actions. */ + @Override public String getActions() { if (actions == null) actions = getActions(this.mask); @@ -369,6 +380,7 @@ public final class PropertyPermission extends BasicPermission { * @return a new PermissionCollection object suitable for storing * PropertyPermissions. */ + @Override public PermissionCollection newPermissionCollection() { return new PropertyPermissionCollection(); } @@ -425,7 +437,7 @@ final class PropertyPermissionCollection extends PermissionCollection * Key is property name; value is PropertyPermission. * Not serialized; see serialization section at end of class. */ - private transient Map perms; + private transient ConcurrentHashMap perms; /** * Boolean saying if "*" is in the collection. @@ -439,7 +451,7 @@ final class PropertyPermissionCollection extends PermissionCollection * Create an empty PropertyPermissionCollection object. */ public PropertyPermissionCollection() { - perms = new HashMap<>(32); // Capacity for default policy + perms = new ConcurrentHashMap<>(32); // Capacity for default policy all_allowed = false; } @@ -455,6 +467,7 @@ final class PropertyPermissionCollection extends PermissionCollection * @exception SecurityException - if this PropertyPermissionCollection * object has been marked readonly */ + @Override public void add(Permission permission) { if (! (permission instanceof PropertyPermission)) throw new IllegalArgumentException("invalid permission: "+ @@ -466,21 +479,30 @@ final class PropertyPermissionCollection extends PermissionCollection PropertyPermission pp = (PropertyPermission) permission; String propName = pp.getName(); - synchronized (this) { - PropertyPermission existing = perms.get(propName); + // Add permission to map if it is absent, or replace with new + // permission if applicable. NOTE: cannot use lambda for + // remappingFunction parameter until JDK-8076596 is fixed. + perms.merge(propName, pp, + new java.util.function.BiFunction<>() { + @Override + public PropertyPermission apply(PropertyPermission existingVal, + PropertyPermission newVal) { - if (existing != null) { - int oldMask = existing.getMask(); - int newMask = pp.getMask(); - if (oldMask != newMask) { - int effective = oldMask | newMask; - String actions = PropertyPermission.getActions(effective); - perms.put(propName, new PropertyPermission(propName, actions)); + int oldMask = existingVal.getMask(); + int newMask = newVal.getMask(); + if (oldMask != newMask) { + int effective = oldMask | newMask; + if (effective == newMask) { + return newVal; + } + if (effective != oldMask) { + return new PropertyPermission(propName, effective); + } + } + return existingVal; } - } else { - perms.put(propName, pp); } - } + ); if (!all_allowed) { if (propName.equals("*")) @@ -497,9 +519,10 @@ final class PropertyPermissionCollection extends PermissionCollection * @return true if "permission" is a proper subset of a permission in * the set, false if not. */ + @Override public boolean implies(Permission permission) { if (! (permission instanceof PropertyPermission)) - return false; + return false; PropertyPermission pp = (PropertyPermission) permission; PropertyPermission x; @@ -509,9 +532,7 @@ final class PropertyPermissionCollection extends PermissionCollection // short circuit if the "*" Permission was added if (all_allowed) { - synchronized (this) { - x = perms.get("*"); - } + x = perms.get("*"); if (x != null) { effective |= x.getMask(); if ((effective & desired) == desired) @@ -526,9 +547,7 @@ final class PropertyPermissionCollection extends PermissionCollection String name = pp.getName(); //System.out.println("check "+name); - synchronized (this) { - x = perms.get(name); - } + x = perms.get(name); if (x != null) { // we have a direct hit! @@ -546,9 +565,7 @@ final class PropertyPermissionCollection extends PermissionCollection name = name.substring(0, last+1) + "*"; //System.out.println("check "+name); - synchronized (this) { - x = perms.get(name); - } + x = perms.get(name); if (x != null) { effective |= x.getMask(); @@ -569,16 +586,14 @@ final class PropertyPermissionCollection extends PermissionCollection * * @return an enumeration of all the PropertyPermission objects. */ + @Override @SuppressWarnings("unchecked") public Enumeration elements() { - // Convert Iterator of Map values into an Enumeration - synchronized (this) { - /** - * Casting to rawtype since Enumeration - * cannot be directly cast to Enumeration - */ - return (Enumeration)Collections.enumeration(perms.values()); - } + /** + * Casting to rawtype since Enumeration + * cannot be directly cast to Enumeration + */ + return (Enumeration)perms.elements(); } private static final long serialVersionUID = 7015263904581634791L; @@ -616,9 +631,7 @@ final class PropertyPermissionCollection extends PermissionCollection // Copy perms into a Hashtable Hashtable permissions = new Hashtable<>(perms.size()*2); - synchronized (this) { - permissions.putAll(perms); - } + permissions.putAll(perms); // Write out serializable fields ObjectOutputStream.PutField pfields = out.putFields(); @@ -646,7 +659,7 @@ final class PropertyPermissionCollection extends PermissionCollection @SuppressWarnings("unchecked") Hashtable permissions = (Hashtable)gfields.get("permissions", null); - perms = new HashMap<>(permissions.size()*2); + perms = new ConcurrentHashMap<>(permissions.size()*2); perms.putAll(permissions); } } diff --git a/jdk/src/java.base/share/classes/java/util/concurrent/LinkedTransferQueue.java b/jdk/src/java.base/share/classes/java/util/concurrent/LinkedTransferQueue.java index 5ebd04923d4..b59042653e7 100644 --- a/jdk/src/java.base/share/classes/java/util/concurrent/LinkedTransferQueue.java +++ b/jdk/src/java.base/share/classes/java/util/concurrent/LinkedTransferQueue.java @@ -780,7 +780,9 @@ public class LinkedTransferQueue extends AbstractQueue } /** - * Version of firstOfMode used by Spliterator + * Version of firstOfMode used by Spliterator. Callers must + * recheck if the returned node's item field is null or + * self-linked before using. */ final Node firstDataNode() { for (Node p = head; p != null;) { @@ -953,11 +955,12 @@ public class LinkedTransferQueue extends AbstractQueue Object[] a = new Object[n]; int i = 0; do { - if ((a[i] = p.item) != null) + Object e = p.item; + if (e != p && (a[i] = e) != null) ++i; if (p == (p = p.next)) p = q.firstDataNode(); - } while (p != null && i < n); + } while (p != null && i < n && p.isData); if ((current = p) == null) exhausted = true; if (i > 0) { @@ -980,11 +983,11 @@ public class LinkedTransferQueue extends AbstractQueue exhausted = true; do { Object e = p.item; + if (e != null && e != p) + action.accept((E)e); if (p == (p = p.next)) p = q.firstDataNode(); - if (e != null) - action.accept((E)e); - } while (p != null); + } while (p != null && p.isData); } } @@ -997,10 +1000,11 @@ public class LinkedTransferQueue extends AbstractQueue ((p = current) != null || (p = q.firstDataNode()) != null)) { Object e; do { - e = p.item; + if ((e = p.item) == p) + e = null; if (p == (p = p.next)) p = q.firstDataNode(); - } while (e == null && p != null); + } while (e == null && p != null && p.isData); if ((current = p) == null) exhausted = true; if (e != null) { diff --git a/jdk/src/java.base/share/classes/javax/security/auth/Subject.java b/jdk/src/java.base/share/classes/javax/security/auth/Subject.java index e570eb6686f..96c6eeaf30e 100644 --- a/jdk/src/java.base/share/classes/javax/security/auth/Subject.java +++ b/jdk/src/java.base/share/classes/javax/security/auth/Subject.java @@ -1401,8 +1401,6 @@ public final class Subject implements java.io.Serializable { /** * Writes this object out to a stream (i.e., serializes it). * - *

    - * * @serialData If this is a private credential set, * a security check is performed to ensure that * the caller has permission to access each credential diff --git a/jdk/src/java.base/share/classes/jdk/internal/org/objectweb/asm/util/TraceClassVisitor.java b/jdk/src/java.base/share/classes/jdk/internal/org/objectweb/asm/util/TraceClassVisitor.java index e927bff9ea5..97163ce47f1 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/org/objectweb/asm/util/TraceClassVisitor.java +++ b/jdk/src/java.base/share/classes/jdk/internal/org/objectweb/asm/util/TraceClassVisitor.java @@ -74,36 +74,34 @@ import jdk.internal.org.objectweb.asm.TypePath; * visitor chain to trace the class that is visited at a given point in this * chain. This may be useful for debugging purposes. *

    - * The trace printed when visiting the Hello class is the following: - *

    + * The trace printed when visiting the {@code Hello} class is the following: *

    * - *
    + * 
    {@code
      * // class version 49.0 (49) // access flags 0x21 public class Hello {
      *
      * // compiled from: Hello.java
      *
    - * // access flags 0x1 public <init> ()V ALOAD 0 INVOKESPECIAL
    - * java/lang/Object <init> ()V RETURN MAXSTACK = 1 MAXLOCALS = 1
    + * // access flags 0x1 public  ()V ALOAD 0 INVOKESPECIAL
    + * java/lang/Object  ()V RETURN MAXSTACK = 1 MAXLOCALS = 1
      *
      * // access flags 0x9 public static main ([Ljava/lang/String;)V GETSTATIC
    - * java/lang/System out Ljava/io/PrintStream; LDC "hello"
    + * java/lang/System out Ljava/io/PrintStream; LDC "hello"
      * INVOKEVIRTUAL java/io/PrintStream println (Ljava/lang/String;)V RETURN
      * MAXSTACK = 2 MAXLOCALS = 1 }
    - * 
    + * }
    * - *
    where Hello is defined by: - *

    + * where {@code Hello} is defined by: *

    * - *
    + * 
    {@code
      * public class Hello {
      *
      *     public static void main(String[] args) {
    - *         System.out.println("hello");
    + *         System.out.println("hello");
      *     }
      * }
    - * 
    + * }
    * *
    * @@ -137,7 +135,7 @@ public final class TraceClassVisitor extends ClassVisitor { * * @param cv * the {@link ClassVisitor} to which this visitor delegates - * calls. May be null. + * calls. May be {@code null}. * @param pw * the print writer to be used to print the class. */ @@ -150,7 +148,7 @@ public final class TraceClassVisitor extends ClassVisitor { * * @param cv * the {@link ClassVisitor} to which this visitor delegates - * calls. May be null. + * calls. May be {@code null}. * @param p * the object that actually converts visit events into text. * @param pw diff --git a/jdk/src/java.base/share/classes/sun/invoke/util/BytecodeName.java b/jdk/src/java.base/share/classes/sun/invoke/util/BytecodeName.java index 9b8fa35cb70..fa34d2bbb6f 100644 --- a/jdk/src/java.base/share/classes/sun/invoke/util/BytecodeName.java +++ b/jdk/src/java.base/share/classes/sun/invoke/util/BytecodeName.java @@ -464,7 +464,7 @@ public class BytecodeName { * Report whether a character is safe in a bytecode name. * This is true of any unicode character except the following * dangerous characters: {@code ".;:$[]<>/"}. - * @param s the proposed character + * @param c the proposed character * @return true if the character is safe to use in classfiles */ public static boolean isSafeBytecodeChar(char c) { diff --git a/jdk/src/java.base/share/classes/sun/misc/ExtensionDependency.java b/jdk/src/java.base/share/classes/sun/misc/ExtensionDependency.java deleted file mode 100644 index 97c9480efd8..00000000000 --- a/jdk/src/java.base/share/classes/sun/misc/ExtensionDependency.java +++ /dev/null @@ -1,554 +0,0 @@ -/* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.misc; - -import java.io.File; -import java.io.FilenameFilter; -import java.io.IOException; -import java.io.FileNotFoundException; -import java.util.StringTokenizer; -import java.util.Vector; -import java.util.Enumeration; -import java.util.jar.JarFile; -import java.util.jar.Manifest; -import java.util.jar.Attributes; -import java.util.jar.Attributes.Name; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.security.PrivilegedExceptionAction; -import java.security.PrivilegedActionException; -import java.net.URL; -import java.net.MalformedURLException; -import sun.net.www.ParseUtil; - -/** - * This class checks dependent extensions a particular jar file may have - * declared through its manifest attributes. - *

    - * Jar file declared dependent extensions through the extension-list - * attribute. The extension-list contains a list of keys used to - * fetch the other attributes describing the required extension. - * If key is the extension key declared in the extension-list - * attribute, the following describing attribute can be found in - * the manifest: - *

      - *
    • key-Extension-Name: (Specification package name)
    • - *
    • key-Specification-Version: (Specification-Version)
    • - *
    • key-Implementation-Version: (Implementation-Version)
    • - *
    • key-Implementation-Vendor-Id: (Imlementation-Vendor-Id)
    • - *
    • key-Implementation-Version: (Implementation version)
    • - *
    • key-Implementation-URL: (URL to download the requested extension)
    • - *
    - *

    - * This class also maintain versioning consistency of installed - * extensions dependencies declared in jar file manifest. - * - * @deprecated this class will be removed in a future release. - * @author Jerome Dochez - */ -@Deprecated -public class ExtensionDependency { - - /* Callbak interfaces to delegate installation of missing extensions */ - private static Vector providers; - - /** - * Register an ExtensionInstallationProvider. The provider is responsible - * for handling the installation (upgrade) of any missing extensions. - * - * @param eip ExtensionInstallationProvider implementation - */ - public synchronized static void addExtensionInstallationProvider - (ExtensionInstallationProvider eip) - { - if (providers == null) { - providers = new Vector<>(); - } - providers.add(eip); - } - - /** - * Unregister a previously installed installation provider - */ - public synchronized static void removeExtensionInstallationProvider - (ExtensionInstallationProvider eip) - { - providers.remove(eip); - } - - /** - * Checks the dependencies of the jar file on installed extension. - * - * @param jar containing the attributes declaring the dependencies - */ - public static boolean checkExtensionsDependencies(JarFile jar) - { - if (providers == null) { - // no need to bother, nobody is registered to install missing - // extensions - return true; - } - - try { - ExtensionDependency extDep = new ExtensionDependency(); - return extDep.checkExtensions(jar); - } catch (ExtensionInstallationException e) { - debug(e.getMessage()); - } - return false; - } - - /* - * Check for all declared required extensions in the jar file - * manifest. - */ - protected boolean checkExtensions(JarFile jar) - throws ExtensionInstallationException - { - Manifest man; - try { - man = jar.getManifest(); - } catch (IOException e) { - return false; - } - - if (man == null) { - // The applet does not define a manifest file, so - // we just assume all dependencies are satisfied. - return true; - } - - boolean result = true; - Attributes attr = man.getMainAttributes(); - if (attr != null) { - // Let's get the list of declared dependencies - String value = attr.getValue(Name.EXTENSION_LIST); - if (value != null) { - StringTokenizer st = new StringTokenizer(value); - // Iterate over all declared dependencies - while (st.hasMoreTokens()) { - String extensionName = st.nextToken(); - debug("The file " + jar.getName() + - " appears to depend on " + extensionName); - // Sanity Check - String extName = extensionName + "-" + - Name.EXTENSION_NAME.toString(); - if (attr.getValue(extName) == null) { - debug("The jar file " + jar.getName() + - " appers to depend on " - + extensionName + " but does not define the " + - extName + " attribute in its manifest "); - - } else { - if (!checkExtension(extensionName, attr)) { - debug("Failed installing " + extensionName); - result = false; - } - } - } - } else { - debug("No dependencies for " + jar.getName()); - } - } - return result; - } - - - /* - * Check that a particular dependency on an extension is satisfied. - * - * @param extensionName is the key used for the attributes in the manifest - * @param attr is the attributes of the manifest file - * - * @return true if the dependency is satisfied by the installed extensions - */ - protected synchronized boolean checkExtension(final String extensionName, - final Attributes attr) - throws ExtensionInstallationException - { - debug("Checking extension " + extensionName); - if (checkExtensionAgainstInstalled(extensionName, attr)) - return true; - - debug("Extension not currently installed "); - ExtensionInfo reqInfo = new ExtensionInfo(extensionName, attr); - return installExtension(reqInfo, null); - } - - /* - * Check if a particular extension is part of the currently installed - * extensions. - * - * @param extensionName is the key for the attributes in the manifest - * @param attr is the attributes of the manifest - * - * @return true if the requested extension is already installed - */ - boolean checkExtensionAgainstInstalled(String extensionName, - Attributes attr) - throws ExtensionInstallationException - { - File fExtension = checkExtensionExists(extensionName); - - if (fExtension != null) { - // Extension already installed, just check against this one - try { - if (checkExtensionAgainst(extensionName, attr, fExtension)) - return true; - } catch (FileNotFoundException e) { - debugException(e); - } catch (IOException e) { - debugException(e); - } - return false; - - } else { - // Not sure if extension is already installed, so check all the - // installed extension jar files to see if we get a match - - File[] installedExts; - - try { - // Get the list of installed extension jar files so we can - // compare the installed versus the requested extension - installedExts = getInstalledExtensions(); - } catch(IOException e) { - debugException(e); - return false; - } - - for (int i=0;i() { - public Manifest run() - throws IOException, FileNotFoundException { - if (!file.exists()) - throw new FileNotFoundException(file.getName()); - JarFile jarFile = new JarFile(file); - return jarFile.getManifest(); - } - }); - } catch(PrivilegedActionException e) { - if (e.getException() instanceof FileNotFoundException) - throw (FileNotFoundException) e.getException(); - throw (IOException) e.getException(); - } - - // Construct the extension information object - ExtensionInfo reqInfo = new ExtensionInfo(extensionName, attr); - debug("Requested Extension : " + reqInfo); - - int isCompatible = ExtensionInfo.INCOMPATIBLE; - ExtensionInfo instInfo = null; - - if (man != null) { - Attributes instAttr = man.getMainAttributes(); - if (instAttr != null) { - instInfo = new ExtensionInfo(null, instAttr); - debug("Extension Installed " + instInfo); - isCompatible = instInfo.isCompatibleWith(reqInfo); - switch(isCompatible) { - case ExtensionInfo.COMPATIBLE: - debug("Extensions are compatible"); - return true; - - case ExtensionInfo.INCOMPATIBLE: - debug("Extensions are incompatible"); - return false; - - default: - // everything else - debug("Extensions require an upgrade or vendor switch"); - return installExtension(reqInfo, instInfo); - - } - } - } - return false; - } - - /* - * An required extension is missing, if an ExtensionInstallationProvider is - * registered, delegate the installation of that particular extension to it. - * - * @param reqInfo Missing extension information - * @param instInfo Older installed version information - * - * @return true if the installation is successful - */ - protected boolean installExtension(ExtensionInfo reqInfo, - ExtensionInfo instInfo) - throws ExtensionInstallationException - { - Vector currentProviders; - synchronized(providers) { - @SuppressWarnings("unchecked") - Vector tmp = - (Vector) providers.clone(); - currentProviders = tmp; - } - for (Enumeration e = currentProviders.elements(); - e.hasMoreElements();) { - ExtensionInstallationProvider eip = e.nextElement(); - - if (eip!=null) { - // delegate the installation to the provider - if (eip.installExtension(reqInfo, instInfo)) { - debug(reqInfo.name + " installation successful"); - Launcher.ExtClassLoader cl = (Launcher.ExtClassLoader) - Launcher.getLauncher().getClassLoader().getParent(); - addNewExtensionsToClassLoader(cl); - return true; - } - } - } - // We have tried all of our providers, noone could install this - // extension, we just return failure at this point - debug(reqInfo.name + " installation failed"); - return false; - } - - /** - * Checks if the extension, that is specified in the extension-list in - * the applet jar manifest, is already installed (i.e. exists in the - * extension directory). - * - * @param extensionName extension name in the extension-list - * - * @return the extension if it exists in the extension directory - */ - private File checkExtensionExists(String extensionName) { - // Function added to fix bug 4504166 - final String extName = extensionName; - final String[] fileExt = {".jar", ".zip"}; - - return AccessController.doPrivileged( - new PrivilegedAction() { - public File run() { - try { - File fExtension; - File[] dirs = getExtDirs(); - - // Search the extension directories for the extension that is specified - // in the attribute extension-list in the applet jar manifest - for (int i=0;i urls = new Vector(); - for (int i = 0; i < dirs.length; i++) { - String[] files = dirs[i].list(new JarFilter()); - if (files != null) { - debug("getExtFiles files.length " + files.length); - for (int j = 0; j < files.length; j++) { - File f = new File(dirs[i], files[j]); - urls.add(f); - debug("getExtFiles f["+j+"] "+ f); - } - } - } - File[] ua = new File[urls.size()]; - urls.copyInto(ua); - debug("getExtFiles ua.length " + ua.length); - return ua; - } - - /* - * @return the list of installed extensions jar files - */ - private File[] getInstalledExtensions() throws IOException { - return AccessController.doPrivileged( - new PrivilegedAction() { - public File[] run() { - try { - return getExtFiles(getExtDirs()); - } catch(IOException e) { - debug("Cannot get list of installed extensions"); - debugException(e); - return new File[0]; - } - } - }); - } - - /* - * Add the newly installed jar file to the extension class loader. - * - * @param cl the current installed extension class loader - * - * @return true if successful - */ - private Boolean addNewExtensionsToClassLoader(Launcher.ExtClassLoader cl) { - try { - File[] installedExts = getInstalledExtensions(); - for (int i=0;i() { - public URL run() { - try { - return ParseUtil.fileToEncodedURL(instFile); - } catch (MalformedURLException e) { - debugException(e); - return null; - } - } - }); - if (instURL != null) { - URL[] urls = cl.getURLs(); - boolean found=false; - for (int j = 0; j{@code - * < 0 if source < version - * > 0 if source > version - * = 0 if source = version} - */ - private int compareExtensionVersion(String source, String target) - throws NumberFormatException - { - source = source.toLowerCase(); - target = target.toLowerCase(); - - return strictCompareExtensionVersion(source, target); - } - - - /* - * helper method to compare two versions. - * version are in the x.y.z.t pattern. - * - * @param source version to compare to - * @param target version used to compare against - * @return

    {@code
    -     *   < 0 if source < version
    -     *   > 0 if source > version
    -     *   = 0 if source = version}
    - */ - private int strictCompareExtensionVersion(String source, String target) - throws NumberFormatException - { - if (source.equals(target)) - return 0; - - StringTokenizer stk = new StringTokenizer(source, ".,"); - StringTokenizer ttk = new StringTokenizer(target, ".,"); - - // Compare number - int n = 0, m = 0, result = 0; - - // Convert token into meaning number for comparision - if (stk.hasMoreTokens()) - n = convertToken(stk.nextToken().toString()); - - // Convert token into meaning number for comparision - if (ttk.hasMoreTokens()) - m = convertToken(ttk.nextToken().toString()); - - if (n > m) - return 1; - else if (m > n) - return -1; - else - { - // Look for index of "." in the string - int sIdx = source.indexOf('.'); - int tIdx = target.indexOf('.'); - - if (sIdx == -1) - sIdx = source.length() - 1; - - if (tIdx == -1) - tIdx = target.length() - 1; - - return strictCompareExtensionVersion(source.substring(sIdx + 1), - target.substring(tIdx + 1)); - } - } - - private int convertToken(String token) - { - if (token == null || token.equals("")) - return 0; - - int charValue = 0; - int charVersion = 0; - int patchVersion = 0; - int strLength = token.length(); - int endIndex = strLength; - char lastChar; - - Object[] args = {name}; - MessageFormat mf = new MessageFormat(rb.getString("optpkg.versionerror")); - String versionError = mf.format(args); - - // Look for "-" for pre-release - int prIndex = token.indexOf('-'); - - // Look for "_" for patch release - int patchIndex = token.indexOf('_'); - - if (prIndex == -1 && patchIndex == -1) - { - // This is a FCS release - try { - return Integer.parseInt(token) * 100; - } catch (NumberFormatException e) { - System.out.println(versionError); - return 0; - } - } - else if (patchIndex != -1) - { - // This is a patch (update) release - int prversion; - try { - // Obtain the version - prversion = Integer.parseInt(token.substring(0, patchIndex)); - - // Check to see if the patch version is in the n.n.n_nnl format (special release) - lastChar = token.charAt(strLength-1); - if (Character.isLetter(lastChar)) { - // letters a-z have values from 10-35 - charValue = Character.getNumericValue(lastChar); - endIndex = strLength-1; - - // Obtain the patch version id - patchVersion = Integer.parseInt(token.substring(patchIndex+1, endIndex)); - - if (charValue >= Character.getNumericValue('a') && charValue <= Character.getNumericValue('z')) { - // This is a special release - charVersion = (patchVersion * 100) + charValue; - } else { - // character is not a a-z letter, ignore - charVersion = 0; - System.out.println(versionError); - } - } else { - // This is a regular update release. Obtain the patch version id - patchVersion = Integer.parseInt(token.substring(patchIndex+1, endIndex)); - } - } catch (NumberFormatException e) { - System.out.println(versionError); - return 0; - } - return prversion * 100 + (patchVersion + charVersion); - } - else - { - //This is a milestone release, either a early access, alpha, beta, or RC - - // Obtain the version - int mrversion; - try { - mrversion = Integer.parseInt(token.substring(0, prIndex)); - } catch (NumberFormatException e) { - System.out.println(versionError); - return 0; - } - - // Obtain the patch version string, including the milestone + version - String prString = token.substring(prIndex + 1); - - // Milestone version - String msVersion = ""; - int delta = 0; - - if (prString.indexOf("ea") != -1) - { - msVersion = prString.substring(2); - delta = 50; - } - else if (prString.indexOf("alpha") != -1) - { - msVersion = prString.substring(5); - delta = 40; - } - else if (prString.indexOf("beta") != -1) - { - msVersion = prString.substring(4); - delta = 30; - } - else if (prString.indexOf("rc") != -1) - { - msVersion = prString.substring(2); - delta = 20; - } - - if (msVersion == null || msVersion.equals("")) - { - // No version after the milestone, assume 0 - return mrversion * 100 - delta ; - } - else - { - // Convert the milestone version - try { - return mrversion * 100 - delta + Integer.parseInt(msVersion); - } catch (NumberFormatException e) { - System.out.println(versionError); - return 0; - } - } - } - } -} diff --git a/jdk/src/java.base/share/classes/sun/misc/ExtensionInstallationProvider.java b/jdk/src/java.base/share/classes/sun/misc/ExtensionInstallationProvider.java deleted file mode 100644 index 438e396b2c2..00000000000 --- a/jdk/src/java.base/share/classes/sun/misc/ExtensionInstallationProvider.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.misc; - -/** - * This interface defines the contract a extension installation capable - * provided to the extension installation dependency mechanism to - * install new extensions on the user's disk - * - * @deprecated this class will be removed in a future release. - * @author Jerome Dochez - */ -@Deprecated -public interface ExtensionInstallationProvider { - - /* - *

    - * Request the installation of an extension in the extension directory - *

    - * - * @param requestExtInfo information on the extension that need to be - * installed - * @param installedExtInfo information on the current compatible installed - * extension. Can be null if no current installation has been found. - * @return true if the installation is successful, false if the - * installation could not be attempted. - * @exception ExtensionInstallationException if an installation was - * attempted but did not succeed. - */ - boolean installExtension(ExtensionInfo requestExtInfo, - ExtensionInfo installedExtInfo) - throws ExtensionInstallationException; -} diff --git a/jdk/src/java.base/share/classes/sun/net/TelnetInputStream.java b/jdk/src/java.base/share/classes/sun/net/TelnetInputStream.java index 3b27edcb3e4..4f4d84e24f6 100644 --- a/jdk/src/java.base/share/classes/sun/net/TelnetInputStream.java +++ b/jdk/src/java.base/share/classes/sun/net/TelnetInputStream.java @@ -31,7 +31,7 @@ import java.io.*; * This class provides input and output streams for telnet clients. * This class overrides read to do CRLF processing as specified in * RFC 854. The class assumes it is running on a system where lines - * are terminated with a single newline character. + * are terminated with a single newline {@literal } character. * * This is the relevant section of RFC 824 regarding CRLF processing: * diff --git a/jdk/src/java.base/share/classes/sun/net/TelnetOutputStream.java b/jdk/src/java.base/share/classes/sun/net/TelnetOutputStream.java index 74f6c9ca973..9a399ed40d0 100644 --- a/jdk/src/java.base/share/classes/sun/net/TelnetOutputStream.java +++ b/jdk/src/java.base/share/classes/sun/net/TelnetOutputStream.java @@ -31,7 +31,7 @@ import java.io.*; * This class provides input and output streams for telnet clients. * This class overrides write to do CRLF processing as specified in * RFC 854. The class assumes it is running on a system where lines - * are terminated with a single newline character. + * are terminated with a single newline {@literal } character. * * This is the relevant section of RFC 824 regarding CRLF processing: * diff --git a/jdk/src/java.base/share/classes/sun/net/URLCanonicalizer.java b/jdk/src/java.base/share/classes/sun/net/URLCanonicalizer.java index dfa84bbd776..1a53f4d6173 100644 --- a/jdk/src/java.base/share/classes/sun/net/URLCanonicalizer.java +++ b/jdk/src/java.base/share/classes/sun/net/URLCanonicalizer.java @@ -28,10 +28,12 @@ package sun.net; /** * Helper class to map URL "abbreviations" to real URLs. * The default implementation supports the following mappings: + *
    {@code
      *   ftp.mumble.bar/... => ftp://ftp.mumble.bar/...
      *   gopher.mumble.bar/... => gopher://gopher.mumble.bar/...
      *   other.name.dom/... => http://other.name.dom/...
      *   /foo/... => file:/foo/...
    + * }
    * * Full URLs (those including a protocol name) are passed through unchanged. * diff --git a/jdk/src/java.base/share/classes/sun/net/ftp/impl/FtpClient.java b/jdk/src/java.base/share/classes/sun/net/ftp/impl/FtpClient.java index 47aabf5cbf2..f21217c58c5 100644 --- a/jdk/src/java.base/share/classes/sun/net/ftp/impl/FtpClient.java +++ b/jdk/src/java.base/share/classes/sun/net/ftp/impl/FtpClient.java @@ -1211,7 +1211,7 @@ public class FtpClient extends sun.net.ftp.FtpClient { * The OutputStream is not closed by this method at the end * of the transfer. * - * @param name a String containing the name of the file to + * @param name a {@code String} containing the name of the file to * retreive from the server. * @param local the OutputStream the file should be written to. * @throws IOException if the transfer fails. diff --git a/jdk/src/java.base/share/classes/sun/net/www/MessageHeader.java b/jdk/src/java.base/share/classes/sun/net/www/MessageHeader.java index c4ab99ac34c..ab192795332 100644 --- a/jdk/src/java.base/share/classes/sun/net/www/MessageHeader.java +++ b/jdk/src/java.base/share/classes/sun/net/www/MessageHeader.java @@ -411,7 +411,7 @@ class MessageHeader { } /** Convert a message-id string to canonical form (strips off - leading and trailing <>s) */ + leading and trailing {@literal <>s}) */ public static String canonicalID(String id) { if (id == null) return ""; diff --git a/jdk/src/java.base/share/classes/sun/net/www/http/HttpClient.java b/jdk/src/java.base/share/classes/sun/net/www/http/HttpClient.java index 0d7f09c6132..ddf8eddff01 100644 --- a/jdk/src/java.base/share/classes/sun/net/www/http/HttpClient.java +++ b/jdk/src/java.base/share/classes/sun/net/www/http/HttpClient.java @@ -625,7 +625,7 @@ public class HttpClient extends NetworkClient { } /** Parse the first line of the HTTP request. It usually looks - something like: "HTTP/1.0 comment\r\n". */ + something like: {@literal "HTTP/1.0 comment\r\n"}. */ public boolean parseHTTP(MessageHeader responses, ProgressSource pi, HttpURLConnection httpuc) throws IOException { diff --git a/jdk/src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java b/jdk/src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java index d787ab3df1a..4f8fde23876 100644 --- a/jdk/src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java +++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/ftp/FtpURLConnection.java @@ -68,13 +68,14 @@ import sun.security.action.GetPropertyAction; *
  • Disconnect
  • *
* You should not have to use it directly in most cases because all will be handled - * in a abstract layer. Here is an example of how to use the class : - *

- * URL url = new URL("ftp://ftp.sun.com/pub/test.txt");

- * UrlConnection con = url.openConnection();

- * InputStream is = con.getInputStream();

- * ...

- * is.close(); + * in a abstract layer. Here is an example of how to use the class: + *

{@code
+ * URL url = new URL("ftp://ftp.sun.com/pub/test.txt");
+ * UrlConnection con = url.openConnection();
+ * InputStream is = con.getInputStream();
+ * ...
+ * is.close();
+ * }
* * @see sun.net.ftp.FtpClient */ @@ -158,7 +159,7 @@ public class FtpURLConnection extends URLConnection { /** * Creates an FtpURLConnection from a URL. * - * @param url The URL to retrieve or store. + * @param url The {@code URL} to retrieve or store. */ public FtpURLConnection(URL url) { this(url, null); @@ -382,7 +383,7 @@ public class FtpURLConnection extends URLConnection { * Get the InputStream to retreive the remote file. It will issue the * "get" (or "dir") command to the ftp server. * - * @return the InputStream to the connection. + * @return the {@code InputStream} to the connection. * * @throws IOException if already opened for output * @throws FtpProtocolException if errors occur during the transfert. @@ -495,7 +496,7 @@ public class FtpURLConnection extends URLConnection { * Get the OutputStream to store the remote file. It will issue the * "put" command to the ftp server. * - * @return the OutputStream to the connection. + * @return the {@code OutputStream} to the connection. * * @throws IOException if already opened for input or the URL * points to a directory @@ -548,9 +549,9 @@ public class FtpURLConnection extends URLConnection { } /** - * Gets the Permission associated with the host & port. + * Gets the {@code Permission} associated with the host and port. * - * @return The Permission object. + * @return The {@code Permission} object. */ @Override public Permission getPermission() { @@ -568,7 +569,7 @@ public class FtpURLConnection extends URLConnection { * exists, overwrite its value with the new value. * * @param key the keyword by which the request is known - * (e.g., "accept"). + * (e.g., "{@code accept}"). * @param value the value associated with it. * @throws IllegalStateException if already connected * @see #getRequestProperty(java.lang.String) diff --git a/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpAuthenticator.java b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpAuthenticator.java index 29902025865..4befe58b5b9 100644 --- a/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpAuthenticator.java +++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpAuthenticator.java @@ -59,6 +59,7 @@ public interface HttpAuthenticator { * supplied or could be found. *

* Example: + *

{@code
      * --> GET http://www.authorization-required.com/ HTTP/1.0
      * <-- HTTP/1.0 403 Unauthorized
      * <-- WWW-Authenticate: Basic realm="WallyWorld"
@@ -67,8 +68,9 @@ public interface HttpAuthenticator {
      *   return "QWadhgWERghghWERfdfQ=="
      * --> GET http://www.authorization-required.com/ HTTP/1.0
      * --> Authorization: Basic QWadhgWERghghWERfdfQ==
-     * <-- HTTP/1.0 200 OK
+     * <-- HTTP/1.0 200 OK}
      *  YAY!!!
+     * 
*/ public String authString (URL u, String scheme, String realm); diff --git a/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java index b9d594b0316..84decd8fcff 100644 --- a/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java +++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/http/HttpURLConnection.java @@ -1954,7 +1954,7 @@ public class HttpURLConnection extends java.net.HttpURLConnection { /** * Set the tunneling status. * - * @param the state + * @param tunnelState the state */ public void setTunnelState(TunnelState tunnelState) { this.tunnelState = tunnelState; diff --git a/jdk/src/java.base/share/classes/sun/net/www/protocol/jar/JarURLConnection.java b/jdk/src/java.base/share/classes/sun/net/www/protocol/jar/JarURLConnection.java index 509b7122128..daa56325e2f 100644 --- a/jdk/src/java.base/share/classes/sun/net/www/protocol/jar/JarURLConnection.java +++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/jar/JarURLConnection.java @@ -338,7 +338,7 @@ public class JarURLConnection extends java.net.JarURLConnection { * Sets the value of the ifModifiedSince field of * this URLConnection to the specified value. * - * @param value the new value. + * @param ifmodifiedsince the new value. * @see java.net.URLConnection#ifModifiedSince */ public void setIfModifiedSince(long ifmodifiedsince) { diff --git a/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotatedTypeFactory.java b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotatedTypeFactory.java index ae32624c071..aa1538fae79 100644 --- a/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotatedTypeFactory.java +++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotatedTypeFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -277,8 +277,14 @@ public final class AnnotatedTypeFactory { @Override public AnnotatedType[] getAnnotatedUpperBounds() { - if (!hasUpperBounds()) - return new AnnotatedType[0]; + if (!hasUpperBounds()) { + return new AnnotatedType[] { buildAnnotatedType(Object.class, + LocationInfo.BASE_LOCATION, + new TypeAnnotation[0], + new TypeAnnotation[0], + null) + }; + } return getAnnotatedBounds(getWildcardType().getUpperBounds()); } diff --git a/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationParser.java b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationParser.java index 32eb02f72eb..02a5a3f480b 100644 --- a/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationParser.java +++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationParser.java @@ -295,7 +295,7 @@ public class AnnotationParser { /** * Returns an annotation of the given type backed by the given - * member -> value map. + * member {@literal ->} value map. */ public static Annotation annotationForMap(final Class type, final Map memberValues) diff --git a/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationType.java b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationType.java index 7bef3e6541e..b8967c14626 100644 --- a/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationType.java +++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/AnnotationType.java @@ -73,8 +73,8 @@ public class AnnotationType { /** * Returns an AnnotationType instance for the specified annotation type. * - * @throw IllegalArgumentException if the specified class object for - * does not represent a valid annotation type + * @throws IllegalArgumentException if the specified class object + * does not represent a valid annotation type */ public static AnnotationType getInstance( Class annotationClass) @@ -183,7 +183,7 @@ public class AnnotationType { /** * Returns member types for this annotation type - * (member name -> type mapping). + * (member name {@literal ->} type mapping). */ public Map> memberTypes() { return memberTypes; @@ -191,7 +191,7 @@ public class AnnotationType { /** * Returns members of this annotation type - * (member name -> associated Method object mapping). + * (member name {@literal ->} associated Method object mapping). */ public Map members() { return members; @@ -199,7 +199,7 @@ public class AnnotationType { /** * Returns the default values for this annotation type - * (Member name -> default value mapping). + * (Member name {@literal ->} default value mapping). */ public Map memberDefaults() { return memberDefaults; diff --git a/jdk/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotationParser.java b/jdk/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotationParser.java index 8eab556fdee..e495026d420 100644 --- a/jdk/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotationParser.java +++ b/jdk/src/java.base/share/classes/sun/reflect/annotation/TypeAnnotationParser.java @@ -199,7 +199,7 @@ public final class TypeAnnotationParser { * Regular Annotations on TypeVariables are stored in the type * annotation byte[] in the class file. * - * @param genericsDecl the declaration declaring the type variable + * @param genericDecl the declaration declaring the type variable * @param typeVarIndex the 0-based index of this type variable in the declaration */ public static Annotation[] parseTypeVariableAnnotations(D genericDecl, diff --git a/jdk/src/java.base/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java b/jdk/src/java.base/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java index 1addbcc9c17..aca919f46ed 100644 --- a/jdk/src/java.base/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java +++ b/jdk/src/java.base/share/classes/sun/reflect/generics/reflectiveObjects/ParameterizedTypeImpl.java @@ -73,17 +73,17 @@ public class ParameterizedTypeImpl implements ParameterizedType { *

This method throws a MalformedParameterizedTypeException * under the following circumstances: * If the number of actual type arguments (i.e., the size of the - * array typeArgs) does not correspond to the number of + * array {@code typeArgs}) does not correspond to the number of * formal type arguments. * If any of the actual type arguments is not an instance of the * bounds on the corresponding formal. * @param rawType the Class representing the generic type declaration being * instantiated - * @param actualTypeArguments - a (possibly empty) array of types + * @param actualTypeArguments a (possibly empty) array of types * representing the actual type arguments to the parameterized type - * @param ownerType - the enclosing type, if known. - * @return An instance of ParameterizedType - * @throws MalformedParameterizedTypeException - if the instantiation + * @param ownerType the enclosing type, if known. + * @return An instance of {@code ParameterizedType} + * @throws MalformedParameterizedTypeException if the instantiation * is invalid */ public static ParameterizedTypeImpl make(Class rawType, @@ -95,18 +95,18 @@ public class ParameterizedTypeImpl implements ParameterizedType { /** - * Returns an array of Type objects representing the actual type + * Returns an array of {@code Type} objects representing the actual type * arguments to this type. * *

Note that in some cases, the returned array be empty. This can occur * if this type represents a non-parameterized type nested within * a parameterized type. * - * @return an array of Type objects representing the actual type + * @return an array of {@code Type} objects representing the actual type * arguments to this type - * @throws TypeNotPresentException if any of the + * @throws TypeNotPresentException if any of the * actual type arguments refers to a non-existent type declaration - * @throws MalformedParameterizedTypeException if any of the + * @throws MalformedParameterizedTypeException if any of the * actual type parameters refer to a parameterized type that cannot * be instantiated for any reason * @since 1.5 @@ -116,10 +116,10 @@ public class ParameterizedTypeImpl implements ParameterizedType { } /** - * Returns the Type object representing the class or interface + * Returns the {@code Type} object representing the class or interface * that declared this type. * - * @return the Type object representing the class or interface + * @return the {@code Type} object representing the class or interface * that declared this type */ public Class getRawType() { @@ -128,18 +128,18 @@ public class ParameterizedTypeImpl implements ParameterizedType { /** - * Returns a Type object representing the type that this type - * is a member of. For example, if this type is O.I, - * return a representation of O. + * Returns a {@code Type} object representing the type that this type + * is a member of. For example, if this type is {@code O.I}, + * return a representation of {@code O}. * - *

If this type is a top-level type, null is returned. + *

If this type is a top-level type, {@code null} is returned. * - * @return a Type object representing the type that + * @return a {@code Type} object representing the type that * this type is a member of. If this type is a top-level type, - * null is returned - * @throws TypeNotPresentException if the owner type + * {@code null} is returned + * @throws TypeNotPresentException if the owner type * refers to a non-existent type declaration - * @throws MalformedParameterizedTypeException if the owner type + * @throws MalformedParameterizedTypeException if the owner type * refers to a parameterized type that cannot be instantiated * for any reason * diff --git a/jdk/src/java.base/share/classes/sun/reflect/generics/scope/ConstructorScope.java b/jdk/src/java.base/share/classes/sun/reflect/generics/scope/ConstructorScope.java index 43acdb6fe06..6cf6dfb83b6 100644 --- a/jdk/src/java.base/share/classes/sun/reflect/generics/scope/ConstructorScope.java +++ b/jdk/src/java.base/share/classes/sun/reflect/generics/scope/ConstructorScope.java @@ -56,9 +56,9 @@ public class ConstructorScope extends AbstractScope> { } /** - * Factory method. Takes a Constructor object and creates a + * Factory method. Takes a {@code Constructor} object and creates a * scope for it. - * @param m - A Constructor whose scope we want to obtain + * @param c - A Constructor whose scope we want to obtain * @return The type-variable scope for the constructor m */ public static ConstructorScope make(Constructor c) { diff --git a/jdk/src/java.base/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java b/jdk/src/java.base/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java index 9640ffb8589..453f6752ed0 100644 --- a/jdk/src/java.base/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java +++ b/jdk/src/java.base/share/classes/sun/security/ssl/SignatureAndHashAlgorithm.java @@ -28,6 +28,7 @@ package sun.security.ssl; import java.security.AlgorithmConstraints; import java.security.CryptoPrimitive; import java.security.PrivateKey; +import java.security.Security; import java.util.Set; import java.util.HashSet; @@ -415,10 +416,12 @@ final class SignatureAndHashAlgorithm { "SHA1withRSA", --p); supports(HashAlgorithm.SHA1, SignatureAlgorithm.ECDSA, "SHA1withECDSA", --p); + if (Security.getProvider("SunMSCAPI") == null) { supports(HashAlgorithm.SHA224, SignatureAlgorithm.RSA, "SHA224withRSA", --p); supports(HashAlgorithm.SHA224, SignatureAlgorithm.ECDSA, "SHA224withECDSA", --p); + } supports(HashAlgorithm.SHA256, SignatureAlgorithm.RSA, "SHA256withRSA", --p); supports(HashAlgorithm.SHA256, SignatureAlgorithm.ECDSA, diff --git a/jdk/src/java.base/share/classes/sun/text/resources/en/FormatData_en_SG.java b/jdk/src/java.base/share/classes/sun/text/resources/en/FormatData_en_SG.java index c46c7652eca..396202060ce 100644 --- a/jdk/src/java.base/share/classes/sun/text/resources/en/FormatData_en_SG.java +++ b/jdk/src/java.base/share/classes/sun/text/resources/en/FormatData_en_SG.java @@ -88,6 +88,14 @@ public class FormatData_en_SG extends ParallelListResourceBundle { "NaN", } }, + { "DatePatterns", + new String[] { + "EEEE, d MMMM, yyyy", // full date pattern + "d MMMM, yyyy", // long date pattern + "d MMM, yyyy", // medium date pattern + "d/M/yy", // short date pattern + } + }, }; } } diff --git a/jdk/src/java.base/share/classes/sun/util/PreHashedMap.java b/jdk/src/java.base/share/classes/sun/util/PreHashedMap.java index 9c83984e099..1bb05705c04 100644 --- a/jdk/src/java.base/share/classes/sun/util/PreHashedMap.java +++ b/jdk/src/java.base/share/classes/sun/util/PreHashedMap.java @@ -121,8 +121,7 @@ public abstract class PreHashedMap *

This method must construct the map's hash chains and store them into * the appropriate elements of the given hash-table row array. * - * @param rows - * The row array to be initialized + * @param ht The row array to be initialized */ protected abstract void init(Object[] ht); diff --git a/jdk/src/java.base/share/classes/sun/util/calendar/BaseCalendar.java b/jdk/src/java.base/share/classes/sun/util/calendar/BaseCalendar.java index a7e763a0d7c..3c07431274c 100644 --- a/jdk/src/java.base/share/classes/sun/util/calendar/BaseCalendar.java +++ b/jdk/src/java.base/share/classes/sun/util/calendar/BaseCalendar.java @@ -28,7 +28,7 @@ package sun.util.calendar; import java.util.TimeZone; /** - * The BaseCalendar provides basic calendar calculation + * The {@code BaseCalendar} provides basic calendar calculation * functions to support the Julian, Gregorian, and Gregorian-based * calendar systems. * @@ -290,11 +290,11 @@ public abstract class BaseCalendar extends AbstractCalendar { /** * Returns 366 if the specified date is in a leap year, or 365 * otherwise This method does not perform the normalization with - * the specified CalendarDate. The - * CalendarDate must be normalized to get a correct + * the specified {@code CalendarDate}. The + * {@code CalendarDate} must be normalized to get a correct * value. * - * @param a CalendarDate + * @param date a {@code CalendarDate} * @return a year length in days * @throws ClassCastException if the specified date is not a * {@link BaseCalendar.Date} @@ -412,7 +412,7 @@ public abstract class BaseCalendar extends AbstractCalendar { /** * Calculates calendar fields and store them in the specified - * CalendarDate. + * {@code CalendarDate}. */ // should be 'protected' public void getCalendarDateFromFixedDate(CalendarDate date, diff --git a/jdk/src/java.base/share/classes/sun/util/calendar/CalendarUtils.java b/jdk/src/java.base/share/classes/sun/util/calendar/CalendarUtils.java index 92cc9b9b9e8..917dbbe657f 100644 --- a/jdk/src/java.base/share/classes/sun/util/calendar/CalendarUtils.java +++ b/jdk/src/java.base/share/classes/sun/util/calendar/CalendarUtils.java @@ -94,7 +94,7 @@ public class CalendarUtils { * 0 and -1%4 is -1. * * @param n the numerator - * @param d a divisor which must be > 0 + * @param d a divisor which must be {@literal > 0} * @param r an array of at least one element in which the value * mod(n, d) is returned. * @return the floor of the quotient. @@ -117,7 +117,7 @@ public class CalendarUtils { * 0 and -1%4 is -1. * * @param n the numerator - * @param d a divisor which must be > 0 + * @param d a divisor which must be {@literal > 0} * @param r an array of at least one element in which the value * mod(n, d) is returned. * @return the floor of the quotient. diff --git a/jdk/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java b/jdk/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java index cb9b74a3c18..c65f942556b 100644 --- a/jdk/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java +++ b/jdk/src/java.base/share/classes/sun/util/calendar/ZoneInfo.java @@ -364,7 +364,7 @@ public class ZoneInfo extends TimeZone { * 0 for January. * @param day The day-in-month of the given date. * @param dayOfWeek The day-of-week of the given date. - * @param millis The milliseconds in day in standard local time. + * @param milliseconds The milliseconds in day in standard local time. * @return The milliseconds to add to UTC to get local time. */ public int getOffset(int era, int year, int month, int day, diff --git a/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleNameProviderImpl.java b/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleNameProviderImpl.java index fefd69d9c9c..9bb46d4e19e 100644 --- a/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleNameProviderImpl.java +++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/LocaleNameProviderImpl.java @@ -72,7 +72,7 @@ public class LocaleNameProviderImpl extends LocaleNameProvider implements Availa * If the name returned cannot be localized according to locale, * (say, the provider does not have a Japanese name for Croatian), * this method returns null. - * @param languageCode the ISO 639 language code string in the form of two + * @param lang the ISO 639 language code string in the form of two * lower-case letters between 'a' (U+0061) and 'z' (U+007A) * @param locale the desired locale * @return the name of the given language code for the specified locale, or null if it's not @@ -129,7 +129,7 @@ public class LocaleNameProviderImpl extends LocaleNameProvider implements Availa * If the name returned cannot be localized according to locale, * (say, the provider does not have a Japanese name for Croatia), * this method returns null. - * @param countryCode the ISO 3166 country code string in the form of two + * @param ctry the ISO 3166 country code string in the form of two * upper-case letters between 'A' (U+0041) and 'Z' (U+005A) * @param locale the desired locale * @return the name of the given country code for the specified locale, or null if it's not @@ -152,7 +152,7 @@ public class LocaleNameProviderImpl extends LocaleNameProvider implements Availa * is appropriate for display to the user. * If the name returned cannot be localized according to locale, * this method returns null. - * @param variant the variant string + * @param vrnt the variant string * @param locale the desired locale * @return the name of the given variant string for the specified locale, or null if it's not * available. diff --git a/jdk/src/java.base/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java b/jdk/src/java.base/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java index cf609658e01..49833933462 100644 --- a/jdk/src/java.base/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java +++ b/jdk/src/java.base/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java @@ -79,7 +79,7 @@ public class TimeZoneNameProviderImpl extends TimeZoneNameProvider { * appropriate for daylight saving time even if the specified time zone * has not observed daylight saving time in the past. * - * @param ID a time zone ID string + * @param id a time zone ID string * @param daylight if true, return the daylight saving name. * @param style either {@link java.util.TimeZone#LONG TimeZone.LONG} or * {@link java.util.TimeZone#SHORT TimeZone.SHORT} diff --git a/jdk/src/java.base/share/classes/sun/util/logging/PlatformLogger.java b/jdk/src/java.base/share/classes/sun/util/logging/PlatformLogger.java index b81269d3fa8..a55f1425830 100644 --- a/jdk/src/java.base/share/classes/sun/util/logging/PlatformLogger.java +++ b/jdk/src/java.base/share/classes/sun/util/logging/PlatformLogger.java @@ -74,10 +74,10 @@ import sun.misc.SharedSecrets; * java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter * * Limitation: - * /conf/logging.properties is the system-wide logging + * {@code /conf/logging.properties} is the system-wide logging * configuration defined in the specification and read in the * default case to configure any java.util.logging.Logger instances. - * Platform loggers will not detect if /conf/logging.properties + * Platform loggers will not detect if {@code /conf/logging.properties} * is modified. In other words, unless the java.util.logging API * is used at runtime or the logging system properties is set, * the platform loggers will use the default setting described above. diff --git a/jdk/src/java.base/share/classes/sun/util/resources/TimeZoneNamesBundle.java b/jdk/src/java.base/share/classes/sun/util/resources/TimeZoneNamesBundle.java index 3385887596e..2706efafe40 100644 --- a/jdk/src/java.base/share/classes/sun/util/resources/TimeZoneNamesBundle.java +++ b/jdk/src/java.base/share/classes/sun/util/resources/TimeZoneNamesBundle.java @@ -55,7 +55,7 @@ import java.util.Set; * array for the enumeration returned by getKeys. *

  • Inserts the time zone ID (the key of the bundle entries) into * the string arrays returned by handleGetObject. - *
      + *
    * All TimeZoneNames resource bundles must extend this * class and implement the getContents method. */ diff --git a/jdk/src/java.base/share/native/libjava/ClassLoader.c b/jdk/src/java.base/share/native/libjava/ClassLoader.c index ae69096bd50..5a8d86156b9 100644 --- a/jdk/src/java.base/share/native/libjava/ClassLoader.c +++ b/jdk/src/java.base/share/native/libjava/ClassLoader.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -479,12 +479,12 @@ Java_java_lang_ClassLoader_00024NativeLibrary_find return res; } /* - * Class: java_lang_ClassLoader_NativeLibrary + * Class: java_lang_ClassLoader * Method: findBuiltinLib * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL -Java_java_lang_ClassLoader_00024NativeLibrary_findBuiltinLib +Java_java_lang_ClassLoader_findBuiltinLib (JNIEnv *env, jclass cls, jstring name) { const char *cname; @@ -500,8 +500,6 @@ Java_java_lang_ClassLoader_00024NativeLibrary_findBuiltinLib JNU_ThrowInternalError(env, "NULL filename for native library"); return NULL; } - // Can't call initIDs because it will recurse into NativeLibrary via - // FindClass to check context so set prochandle here as well. procHandle = getProcessHandle(); cname = JNU_GetStringPlatformChars(env, name, 0); if (cname == NULL) { diff --git a/jdk/src/java.base/unix/classes/java/lang/ProcessImpl.java b/jdk/src/java.base/unix/classes/java/lang/ProcessImpl.java index 625a0bed15a..c2c85a69f04 100644 --- a/jdk/src/java.base/unix/classes/java/lang/ProcessImpl.java +++ b/jdk/src/java.base/unix/classes/java/lang/ProcessImpl.java @@ -542,7 +542,22 @@ final class ProcessImpl extends Process { @Override public CompletableFuture onExit() { return ProcessHandleImpl.completion(pid, false) - .handleAsync((exitStatus, unusedThrowable) -> this); + .handleAsync((exitStatus, unusedThrowable) -> { + boolean interrupted = false; + while (true) { + // Ensure that the concurrent task setting the exit status has completed + try { + waitFor(); + break; + } catch (InterruptedException ie) { + interrupted = true; + } + } + if (interrupted) { + Thread.currentThread().interrupt(); + } + return this; + }); } @Override diff --git a/jdk/src/java.base/unix/classes/sun/misc/FileURLMapper.java b/jdk/src/java.base/unix/classes/sun/misc/FileURLMapper.java index 990704e14e3..eb359368ad5 100644 --- a/jdk/src/java.base/unix/classes/sun/misc/FileURLMapper.java +++ b/jdk/src/java.base/unix/classes/sun/misc/FileURLMapper.java @@ -50,7 +50,7 @@ public class FileURLMapper { } /** - * @returns the platform specific path corresponding to the URL + * @return the platform specific path corresponding to the URL * so long as the URL does not contain a hostname in the authority field. */ diff --git a/jdk/src/java.base/unix/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java b/jdk/src/java.base/unix/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java index 0c4523c19f1..398dda86f57 100644 --- a/jdk/src/java.base/unix/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java +++ b/jdk/src/java.base/unix/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java @@ -113,7 +113,8 @@ public class NTLMAuthentication extends AuthenticationInfo { Client client; /** * Create a NTLMAuthentication: - * Username may be specified as domainusername in the application Authenticator. + * Username may be specified as {@literal domainusername} + * in the application Authenticator. * If this notation is not used, then the domain will be taken * from a system property: "http.auth.ntlm.domain". */ diff --git a/jdk/src/java.base/unix/native/libjava/UnixFileSystem_md.c b/jdk/src/java.base/unix/native/libjava/UnixFileSystem_md.c index 487e8a2bac3..cd166933363 100644 --- a/jdk/src/java.base/unix/native/libjava/UnixFileSystem_md.c +++ b/jdk/src/java.base/unix/native/libjava/UnixFileSystem_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,12 @@ #include #include #include +#ifdef MACOSX +#include +#include +#else #include +#endif #include #include #include @@ -46,8 +51,10 @@ #define dirent64 dirent #define readdir64_r readdir_r #define stat64 stat +#ifndef MACOSX #define statvfs64 statvfs #endif +#endif /* -- Field IDs -- */ @@ -432,8 +439,32 @@ Java_java_io_UnixFileSystem_getSpace(JNIEnv *env, jobject this, jlong rv = 0L; WITH_FIELD_PLATFORM_STRING(env, file, ids.path, path) { +#ifdef MACOSX + struct statfs fsstat; +#else struct statvfs64 fsstat; +#endif memset(&fsstat, 0, sizeof(fsstat)); +#ifdef MACOSX + if (statfs(path, &fsstat) == 0) { + switch(t) { + case java_io_FileSystem_SPACE_TOTAL: + rv = jlong_mul(long_to_jlong(fsstat.f_bsize), + long_to_jlong(fsstat.f_blocks)); + break; + case java_io_FileSystem_SPACE_FREE: + rv = jlong_mul(long_to_jlong(fsstat.f_bsize), + long_to_jlong(fsstat.f_bfree)); + break; + case java_io_FileSystem_SPACE_USABLE: + rv = jlong_mul(long_to_jlong(fsstat.f_bsize), + long_to_jlong(fsstat.f_bavail)); + break; + default: + assert(0); + } + } +#else if (statvfs64(path, &fsstat) == 0) { switch(t) { case java_io_FileSystem_SPACE_TOTAL: @@ -452,6 +483,7 @@ Java_java_io_UnixFileSystem_getSpace(JNIEnv *env, jobject this, assert(0); } } +#endif } END_PLATFORM_STRING(env, path); return rv; } diff --git a/jdk/src/java.base/unix/native/libnet/Inet4AddressImpl.c b/jdk/src/java.base/unix/native/libnet/Inet4AddressImpl.c index e07b2f578f4..68e89c3579a 100644 --- a/jdk/src/java.base/unix/native/libnet/Inet4AddressImpl.c +++ b/jdk/src/java.base/unix/native/libnet/Inet4AddressImpl.c @@ -121,7 +121,7 @@ Java_java_net_Inet4AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this, jobjectArray ret = 0; int retLen = 0; - int error=0; + int getaddrinfo_error=0; struct addrinfo hints, *res, *resNew = NULL; initInetAddressIDs(env); @@ -149,22 +149,24 @@ Java_java_net_Inet4AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this, return NULL; } + + getaddrinfo_error = getaddrinfo(hostname, NULL, &hints, &res); + #ifdef MACOSX - /* If we're looking up the local machine, bypass DNS lookups and get - * address from getifaddrs. - */ - ret = lookupIfLocalhost(env, hostname, JNI_FALSE); - if (ret != NULL || (*env)->ExceptionCheck(env)) { - JNU_ReleaseStringPlatformChars(env, host, hostname); - return ret; + if (getaddrinfo_error) { + // If getaddrinfo fails try getifaddrs. + ret = lookupIfLocalhost(env, hostname, JNI_FALSE); + if (ret != NULL || (*env)->ExceptionCheck(env)) { + JNU_ReleaseStringPlatformChars(env, host, hostname); + return ret; + } } #endif - error = getaddrinfo(hostname, NULL, &hints, &res); - - if (error) { + if (getaddrinfo_error) { /* report error */ - NET_ThrowUnknownHostExceptionWithGaiError(env, hostname, error); + NET_ThrowUnknownHostExceptionWithGaiError( + env, hostname, getaddrinfo_error); JNU_ReleaseStringPlatformChars(env, host, hostname); return NULL; } else { diff --git a/jdk/src/java.base/unix/native/libnet/Inet6AddressImpl.c b/jdk/src/java.base/unix/native/libnet/Inet6AddressImpl.c index 7e348b6b79c..84e7ca4edf2 100644 --- a/jdk/src/java.base/unix/native/libnet/Inet6AddressImpl.c +++ b/jdk/src/java.base/unix/native/libnet/Inet6AddressImpl.c @@ -254,7 +254,7 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this, jobjectArray ret = 0; int retLen = 0; - int error=0; + int getaddrinfo_error=0; #ifdef AF_INET6 struct addrinfo hints, *res, *resNew = NULL; #endif /* AF_INET6 */ @@ -269,19 +269,6 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this, hostname = JNU_GetStringPlatformChars(env, host, JNI_FALSE); CHECK_NULL_RETURN(hostname, NULL); -#ifdef MACOSX - /* - * If we're looking up the local machine, attempt to get the address - * from getifaddrs. This ensures we get an IPv6 address for the local - * machine. - */ - ret = lookupIfLocalhost(env, hostname, JNI_TRUE); - if (ret != NULL || (*env)->ExceptionCheck(env)) { - JNU_ReleaseStringPlatformChars(env, host, hostname); - return ret; - } -#endif - #ifdef AF_INET6 /* Try once, with our static buffer. */ memset(&hints, 0, sizeof(hints)); @@ -301,11 +288,27 @@ Java_java_net_Inet6AddressImpl_lookupAllHostAddr(JNIEnv *env, jobject this, } #endif - error = getaddrinfo(hostname, NULL, &hints, &res); + getaddrinfo_error = getaddrinfo(hostname, NULL, &hints, &res); - if (error) { +#ifdef MACOSX + if (getaddrinfo_error) { + /* + * If getaddrinfo fails looking up the local machine, attempt to get the + * address from getifaddrs. This ensures we get an IPv6 address for the + * local machine. + */ + ret = lookupIfLocalhost(env, hostname, JNI_TRUE); + if (ret != NULL || (*env)->ExceptionCheck(env)) { + JNU_ReleaseStringPlatformChars(env, host, hostname); + return ret; + } + } +#endif + + if (getaddrinfo_error) { /* report error */ - NET_ThrowUnknownHostExceptionWithGaiError(env, hostname, error); + NET_ThrowUnknownHostExceptionWithGaiError( + env, hostname, getaddrinfo_error); JNU_ReleaseStringPlatformChars(env, host, hostname); return NULL; } else { diff --git a/jdk/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c b/jdk/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c index e8a1623a87d..2808cc189f8 100644 --- a/jdk/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c +++ b/jdk/src/java.base/unix/native/libnio/fs/UnixNativeDispatcher.c @@ -35,7 +35,12 @@ #include #include #include +#ifdef MACOSX +#include +#include +#else #include +#endif #include #ifdef __solaris__ @@ -50,7 +55,9 @@ #include #define stat64 stat +#ifndef MACOSX #define statvfs64 statvfs +#endif #define open64 open #define fstat64 fstat @@ -901,11 +908,18 @@ Java_sun_nio_fs_UnixNativeDispatcher_statvfs0(JNIEnv* env, jclass this, jlong pathAddress, jobject attrs) { int err; +#ifdef MACOSX + struct statfs buf; +#else struct statvfs64 buf; +#endif const char* path = (const char*)jlong_to_ptr(pathAddress); - +#ifdef MACOSX + RESTARTABLE(statfs(path, &buf), err); +#else RESTARTABLE(statvfs64(path, &buf), err); +#endif if (err == -1) { throwUnixException(env, errno); } else { @@ -921,7 +935,11 @@ Java_sun_nio_fs_UnixNativeDispatcher_statvfs0(JNIEnv* env, jclass this, buf.f_bavail = 0; } #endif +#ifdef MACOSX + (*env)->SetLongField(env, attrs, attrs_f_frsize, long_to_jlong(buf.f_bsize)); +#else (*env)->SetLongField(env, attrs, attrs_f_frsize, long_to_jlong(buf.f_frsize)); +#endif (*env)->SetLongField(env, attrs, attrs_f_blocks, long_to_jlong(buf.f_blocks)); (*env)->SetLongField(env, attrs, attrs_f_bfree, long_to_jlong(buf.f_bfree)); (*env)->SetLongField(env, attrs, attrs_f_bavail, long_to_jlong(buf.f_bavail)); diff --git a/jdk/src/java.base/windows/classes/sun/misc/FileURLMapper.java b/jdk/src/java.base/windows/classes/sun/misc/FileURLMapper.java index 9eb0cc6a611..edadd9d3730 100644 --- a/jdk/src/java.base/windows/classes/sun/misc/FileURLMapper.java +++ b/jdk/src/java.base/windows/classes/sun/misc/FileURLMapper.java @@ -46,7 +46,7 @@ public class FileURLMapper { } /** - * @returns the platform specific path corresponding to the URL, and in particular + * @return the platform specific path corresponding to the URL, and in particular * returns a UNC when the authority contains a hostname */ diff --git a/jdk/src/java.base/windows/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java b/jdk/src/java.base/windows/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java index 6d6340a5d22..0e17de44b4c 100644 --- a/jdk/src/java.base/windows/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java +++ b/jdk/src/java.base/windows/classes/sun/net/www/protocol/http/ntlm/NTLMAuthentication.java @@ -83,7 +83,8 @@ public class NTLMAuthentication extends AuthenticationInfo { /** * Create a NTLMAuthentication: - * Username may be specified as domainusername in the application Authenticator. + * Username may be specified as {@literal domainusername} + * in the application Authenticator. * If this notation is not used, then the domain will be taken * from a system property: "http.auth.ntlm.domain". */ diff --git a/jdk/src/java.datatransfer/share/classes/sun/datatransfer/DataFlavorUtil.java b/jdk/src/java.datatransfer/share/classes/sun/datatransfer/DataFlavorUtil.java index d7f9c2763cc..4fe07da9e44 100644 --- a/jdk/src/java.datatransfer/share/classes/sun/datatransfer/DataFlavorUtil.java +++ b/jdk/src/java.datatransfer/share/classes/sun/datatransfer/DataFlavorUtil.java @@ -55,7 +55,7 @@ import java.util.function.Supplier; /** * Utility class with different datatransfer helper functions * - * @see 1.9 + * @since 1.9 */ public class DataFlavorUtil { diff --git a/jdk/src/java.desktop/macosx/classes/com/apple/eio/FileManager.java b/jdk/src/java.desktop/macosx/classes/com/apple/eio/FileManager.java index 84ffa184207..e098654a03d 100644 --- a/jdk/src/java.desktop/macosx/classes/com/apple/eio/FileManager.java +++ b/jdk/src/java.desktop/macosx/classes/com/apple/eio/FileManager.java @@ -97,7 +97,8 @@ public class FileManager { /** - * Converts an OSType (e.g. "macs" from ) into an int. + * Converts an OSType (e.g. "macs" + * from {@literal }) into an int. * * @param type the 4 character type to convert. * @return an int representing the 4 character value @@ -355,7 +356,7 @@ public class FileManager { /** * Moves the specified file to the Trash * - * @param file + * @param file the file * @return returns true if the NSFileManager successfully moved the file to the Trash. * @throws FileNotFoundException * diff --git a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java index f89d27a2543..0765fae5156 100644 --- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java +++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java @@ -985,11 +985,13 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo } private void checkZoom() { - int state = peer.getState(); - if (state != Frame.MAXIMIZED_BOTH && isMaximized()) { - deliverZoom(true); - } else if (state == Frame.MAXIMIZED_BOTH && !isMaximized()) { - deliverZoom(false); + if (peer != null) { + int state = peer.getState(); + if (state != Frame.MAXIMIZED_BOTH && isMaximized()) { + deliverZoom(true); + } else if (state == Frame.MAXIMIZED_BOTH && !isMaximized()) { + deliverZoom(false); + } } } diff --git a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java index e2dcd71733b..0188339093e 100644 --- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java +++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/LWCToolkit.java @@ -370,8 +370,7 @@ public final class LWCToolkit extends LWToolkit { protected void initializeDesktopProperties() { super.initializeDesktopProperties(); Map fontHints = new HashMap<>(); - fontHints.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - fontHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + fontHints.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_LCD_HRGB); desktopProperties.put(SunToolkit.DESKTOPFONTHINTS, fontHints); desktopProperties.put("awt.mouse.numButtons", BUTTONS); diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CFRetainedResource.m b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CFRetainedResource.m index 463c6bcc498..1371189b83f 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CFRetainedResource.m +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CFRetainedResource.m @@ -23,6 +23,7 @@ * questions. */ +#import #import #import "sun_lwawt_macosx_CFRetainedResource.h" @@ -37,7 +38,10 @@ JNIEXPORT void JNICALL Java_sun_lwawt_macosx_CFRetainedResource_nativeCFRelease (JNIEnv *env, jclass clazz, jlong ptr, jboolean releaseOnAppKitThread) { if (releaseOnAppKitThread) { - [JNFRunLoop performOnMainThreadWaiting:NO withBlock:^(){ + // Releasing resources on the main AppKit message loop only + // Releasing resources on the nested loops may cause dangling + // pointers after the nested loop is exited + [NSApp postRunnableEvent:^(){ CFRelease(jlong_to_ptr(ptr)); }]; } else { diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.m b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.m index 930c70e0963..07cd78b38c3 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.m +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/LWCToolkit.m @@ -516,8 +516,10 @@ JNF_COCOA_ENTER(env); beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.010]]; if (processEvents) { //We do not spin a runloop here as date is nil, so does not matter which mode to use + // Processing all events excluding NSApplicationDefined which need to be processed + // on the main loop only (those events are intended for disposing resources) NSEvent *event; - if ((event = [NSApp nextEventMatchingMask:NSAnyEventMask + if ((event = [NSApp nextEventMatchingMask:(NSAnyEventMask & ~NSApplicationDefined) untilDate:nil inMode:NSDefaultRunLoopMode dequeue:YES]) != nil) { diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/font/AWTStrike.m b/jdk/src/java.desktop/macosx/native/libawt_lwawt/font/AWTStrike.m index 2a4a2806c78..e55a267d5fe 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/font/AWTStrike.m +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/font/AWTStrike.m @@ -311,21 +311,26 @@ JNF_COCOA_ENTER(env); jlong *glyphInfos = (*env)->GetPrimitiveArrayCritical(env, glyphInfoLongArray, NULL); - if (glyphInfos != NULL) { - jint *rawGlyphCodes = + + jint *rawGlyphCodes = (*env)->GetPrimitiveArrayCritical(env, glyphCodes, NULL); - - if (rawGlyphCodes != NULL) { + @try { + if (rawGlyphCodes != NULL && glyphInfos != NULL) { CGGlyphImages_GetGlyphImagePtrs(glyphInfos, awtStrike, - rawGlyphCodes, len); - - (*env)->ReleasePrimitiveArrayCritical(env, glyphCodes, - rawGlyphCodes, JNI_ABORT); + rawGlyphCodes, len); + } + } + @finally { + if (rawGlyphCodes != NULL) { + (*env)->ReleasePrimitiveArrayCritical(env, glyphCodes, + rawGlyphCodes, JNI_ABORT); + } + if (glyphInfos != NULL) { + // Do not use JNI_COMMIT, as that will not free the buffer copy + // when +ProtectJavaHeap is on. + (*env)->ReleasePrimitiveArrayCritical(env, glyphInfoLongArray, + glyphInfos, 0); } - // Do not use JNI_COMMIT, as that will not free the buffer copy - // when +ProtectJavaHeap is on. - (*env)->ReleasePrimitiveArrayCritical(env, glyphInfoLongArray, - glyphInfos, 0); } JNF_COCOA_EXIT(env); diff --git a/jdk/src/java.desktop/macosx/native/libawt_lwawt/font/CGGlyphImages.m b/jdk/src/java.desktop/macosx/native/libawt_lwawt/font/CGGlyphImages.m index 1901c1fc5cb..994bda41982 100644 --- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/font/CGGlyphImages.m +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/font/CGGlyphImages.m @@ -195,19 +195,41 @@ DUMP_GLYPHINFO(const GlyphInfo *info) #pragma mark --- Font Rendering Mode Descriptors --- +static Int32 reverseGamma = 0; + +static UInt8 reverseGammaLut[256] = { 0 }; + +static inline UInt8* getReverseGammaLut() { + if (reverseGamma == 0) { + // initialize gamma lut + double gamma; + int i; + const char* pGammaEnv = getenv("J2D_LCD_REVERSE_GAMMA"); + if (pGammaEnv != NULL) { + reverseGamma = atol(pGammaEnv); + } + + if (reverseGamma < 100 || reverseGamma > 250) { + reverseGamma = 180; + } + + gamma = 100.0 / reverseGamma; + for (i = 0; i < 256; i++) { + double x = ((double)i) / 255.0; + reverseGammaLut[i] = (UInt8)(255 * pow(x, gamma)); + } + } + return reverseGammaLut; +} static inline void CGGI_CopyARGBPixelToRGBPixel(const UInt32 p, UInt8 *dst) { -#if __LITTLE_ENDIAN__ - *(dst + 2) = 0xFF - (p >> 24 & 0xFF); - *(dst + 1) = 0xFF - (p >> 16 & 0xFF); - *(dst) = 0xFF - (p >> 8 & 0xFF); -#else - *(dst) = 0xFF - (p >> 16 & 0xFF); - *(dst + 1) = 0xFF - (p >> 8 & 0xFF); - *(dst + 2) = 0xFF - (p & 0xFF); -#endif + UInt8* lut = getReverseGammaLut(); + + *(dst + 0) = lut[0xFF - (p >> 16 & 0xFF)]; // red + *(dst + 1) = lut[0xFF - (p >> 8 & 0xFF)]; // green + *(dst + 2) = lut[0xFF - (p & 0xFF)]; // blue } static void @@ -222,17 +244,14 @@ CGGI_CopyImageFromCanvasToRGBInfo(CGGI_GlyphCanvas *canvas, GlyphInfo *info) size_t height = info->height; size_t y; + + // fill empty glyph image with black-on-white glyph for (y = 0; y < height; y++) { size_t destRow = y * destRowWidth * 3; size_t srcRow = y * srcRowWidth; size_t x; for (x = 0; x < destRowWidth; x++) { - // size_t x3 = x * 3; - // UInt32 p = src[srcRow + x]; - // dest[destRow + x3] = 0xFF - (p >> 16 & 0xFF); - // dest[destRow + x3 + 1] = 0xFF - (p >> 8 & 0xFF); - // dest[destRow + x3 + 2] = 0xFF - (p & 0xFF); CGGI_CopyARGBPixelToRGBPixel(src[srcRow + x], dest + destRow + x * 3); } @@ -260,13 +279,9 @@ CGGI_CopyImageFromCanvasToRGBInfo(CGGI_GlyphCanvas *canvas, GlyphInfo *info) //} static inline UInt8 -CGGI_ConvertPixelToGreyBit(UInt32 p) +CGGI_ConvertBWPixelToByteGray(UInt32 p) { -#ifdef __LITTLE_ENDIAN__ - return 0xFF - ((p >> 24 & 0xFF) + (p >> 16 & 0xFF) + (p >> 8 & 0xFF)) / 3; -#else - return 0xFF - ((p >> 16 & 0xFF) + (p >> 8 & 0xFF) + (p & 0xFF)) / 3; -#endif + return 0xFF - (((p >> 24 & 0xFF) + (p >> 16 & 0xFF) + (p >> 8 & 0xFF)) / 3); } static void @@ -281,14 +296,15 @@ CGGI_CopyImageFromCanvasToAlphaInfo(CGGI_GlyphCanvas *canvas, GlyphInfo *info) size_t height = info->height; size_t y; + + // fill empty glyph image with black-on-white glyph for (y = 0; y < height; y++) { size_t destRow = y * destRowWidth; size_t srcRow = y * srcRowWidth; - size_t x; for (x = 0; x < destRowWidth; x++) { UInt32 p = src[srcRow + x]; - dest[destRow + x] = CGGI_ConvertPixelToGreyBit(p); + dest[destRow + x] = CGGI_ConvertBWPixelToByteGray(p); } } } @@ -316,13 +332,11 @@ CGGI_GetRenderingMode(const AWTStrike *strike) { CGGI_RenderingMode mode; mode.cgFontMode = strike->fStyle; + NSException *e = nil; switch (strike->fAAStyle) { - case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_DEFAULT: case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_OFF: case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_ON: - case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_GASP: - default: mode.glyphDescriptor = &grey; break; case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_LCD_HRGB: @@ -331,6 +345,17 @@ CGGI_GetRenderingMode(const AWTStrike *strike) case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_LCD_VBGR: mode.glyphDescriptor = &rgb; break; + case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_GASP: + case sun_awt_SunHints_INTVAL_TEXT_ANTIALIAS_DEFAULT: + default: + /* we expect that text antialiasing hint has been already + * evaluated. Report an error if we get 'unevaluated' hint here. + */ + e = [NSException + exceptionWithName:@"IllegalArgumentException" + reason:@"Invalid hint value" + userInfo:nil]; + @throw e; } return mode; @@ -345,7 +370,8 @@ CGGI_GetRenderingMode(const AWTStrike *strike) */ static inline void CGGI_InitCanvas(CGGI_GlyphCanvas *canvas, - const vImagePixelCount width, const vImagePixelCount height) + const vImagePixelCount width, const vImagePixelCount height, + const CGGI_RenderingMode* mode) { // our canvas is *always* 4-byte ARGB size_t bytesPerRow = width * sizeof(UInt32); @@ -356,19 +382,26 @@ CGGI_InitCanvas(CGGI_GlyphCanvas *canvas, canvas->image->height = height; canvas->image->rowBytes = bytesPerRow; - canvas->image->data = (void *)calloc(byteCount, sizeof(UInt32)); + canvas->image->data = (void *)calloc(byteCount, sizeof(UInt8)); if (canvas->image->data == NULL) { [[NSException exceptionWithName:NSMallocException reason:@"Failed to allocate memory for the buffer which backs the CGContext for glyph strikes." userInfo:nil] raise]; } - CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB); + uint32_t bmpInfo = kCGImageAlphaPremultipliedFirst; + if (mode->glyphDescriptor == &rgb) { + bmpInfo |= kCGBitmapByteOrder32Host; + } + + CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB); canvas->context = CGBitmapContextCreate(canvas->image->data, width, height, 8, bytesPerRow, colorSpace, - kCGImageAlphaPremultipliedFirst); + bmpInfo); + // set foreground color CGContextSetRGBFillColor(canvas->context, 0.0f, 0.0f, 0.0f, 1.0f); + CGContextSetFontSize(canvas->context, 1); CGContextSaveGState(canvas->context); @@ -404,7 +437,9 @@ CGGI_FreeCanvas(CGGI_GlyphCanvas *canvas) * Quick and easy inline to check if this canvas is big enough. */ static inline void -CGGI_SizeCanvas(CGGI_GlyphCanvas *canvas, const vImagePixelCount width, const vImagePixelCount height, const JRSFontRenderingStyle style) +CGGI_SizeCanvas(CGGI_GlyphCanvas *canvas, const vImagePixelCount width, + const vImagePixelCount height, + const CGGI_RenderingMode* mode) { if (canvas->image != NULL && width < canvas->image->width && @@ -418,8 +453,9 @@ CGGI_SizeCanvas(CGGI_GlyphCanvas *canvas, const vImagePixelCount width, const vI CGGI_FreeCanvas(canvas); CGGI_InitCanvas(canvas, width * CGGI_GLYPH_CANVAS_SLACK, - height * CGGI_GLYPH_CANVAS_SLACK); - JRSFontSetRenderingStyleOnContext(canvas->context, style); + height * CGGI_GLYPH_CANVAS_SLACK, + mode); + JRSFontSetRenderingStyleOnContext(canvas->context, mode->cgFontMode); } /* @@ -443,6 +479,7 @@ CGGI_ClearCanvas(CGGI_GlyphCanvas *canvas, GlyphInfo *info) Pixel_8888 opaqueWhite = { 0xFF, 0xFF, 0xFF, 0xFF }; #endif + // clear canvas background and set foreground color vImageBufferFill_ARGB8888(&canvasRectToClear, opaqueWhite, kvImageNoFlags); } @@ -577,7 +614,7 @@ CGGI_CreateImageForUnicode GlyphInfo *info = CGGI_CreateNewGlyphInfoFrom(advance, bbox, strike, mode); // fix the context size, just in case the substituted character is unexpectedly large - CGGI_SizeCanvas(canvas, info->width, info->height, mode->cgFontMode); + CGGI_SizeCanvas(canvas, info->width, info->height, mode); // align the transform for the real CoreText strike CGContextSetTextMatrix(canvas->context, strike->fAltTx); @@ -653,8 +690,11 @@ CGGI_FillImagesForGlyphsWithSizedCanvas(CGGI_GlyphCanvas *canvas, #endif } -static NSString *threadLocalCanvasKey = - @"Java CoreGraphics Text Renderer Cached Canvas"; +static NSString *threadLocalAACanvasKey = + @"Java CoreGraphics Text Renderer Cached Canvas for AA"; + +static NSString *threadLocalLCDCanvasKey = + @"Java CoreGraphics Text Renderer Cached Canvas for LCD"; /* * This is the maximum length and height times the above slack squared @@ -678,25 +718,28 @@ CGGI_FillImagesForGlyphs(jlong *glyphInfos, const AWTStrike *strike, CGGI_GLYPH_CANVAS_MAX*CGGI_GLYPH_CANVAS_MAX*CGGI_GLYPH_CANVAS_SLACK*CGGI_GLYPH_CANVAS_SLACK) { CGGI_GlyphCanvas *tmpCanvas = [[CGGI_GlyphCanvas alloc] init]; - CGGI_InitCanvas(tmpCanvas, maxWidth, maxHeight); + CGGI_InitCanvas(tmpCanvas, maxWidth, maxHeight, mode); CGGI_FillImagesForGlyphsWithSizedCanvas(tmpCanvas, strike, - mode, glyphInfos, uniChars, - glyphs, len); + mode, glyphInfos, uniChars, + glyphs, len); CGGI_FreeCanvas(tmpCanvas); [tmpCanvas release]; return; } - NSMutableDictionary *threadDict = [[NSThread currentThread] threadDictionary]; - CGGI_GlyphCanvas *canvas = [threadDict objectForKey:threadLocalCanvasKey]; + + NSString* theKey = (mode->glyphDescriptor == &rgb) ? + threadLocalLCDCanvasKey : threadLocalAACanvasKey; + + CGGI_GlyphCanvas *canvas = [threadDict objectForKey:theKey]; if (canvas == nil) { canvas = [[CGGI_GlyphCanvas alloc] init]; - [threadDict setObject:canvas forKey:threadLocalCanvasKey]; + [threadDict setObject:canvas forKey:theKey]; } - CGGI_SizeCanvas(canvas, maxWidth, maxHeight, mode->cgFontMode); + CGGI_SizeCanvas(canvas, maxWidth, maxHeight, mode); CGGI_FillImagesForGlyphsWithSizedCanvas(canvas, strike, mode, glyphInfos, uniChars, glyphs, len); } diff --git a/jdk/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.h b/jdk/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.h index 92692950608..99c7d63175a 100644 --- a/jdk/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.h +++ b/jdk/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.h @@ -37,6 +37,7 @@ - (void) registerWithProcessManager; - (void) setDockIconWithEnv:(JNIEnv *)env; - (void) postDummyEvent; +- (void) postRunnableEvent:(void (^)())block; - (void) waitForDummyEvent; + (void) runAWTLoopWithApp:(NSApplication*)app; diff --git a/jdk/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.m b/jdk/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.m index 3e11e1dda7e..fdaa1c3a8cb 100644 --- a/jdk/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.m +++ b/jdk/src/java.desktop/macosx/native/libosxapp/NSApplicationAWT.m @@ -337,9 +337,13 @@ AWT_ASSERT_APPKIT_THREAD; - (void)sendEvent:(NSEvent *)event { - if ([event type] == NSApplicationDefined && TS_EQUAL([event timestamp], dummyEventTimestamp)) { + if ([event type] == NSApplicationDefined && TS_EQUAL([event timestamp], dummyEventTimestamp) && [event subtype] == 0) { [seenDummyEventLock lockWhenCondition:NO]; [seenDummyEventLock unlockWithCondition:YES]; + } else if ([event type] == NSApplicationDefined && [event subtype] == 777) { + void (^block)() = (void (^)()) [event data1]; + block(); + [block release]; } else if ([event type] == NSKeyUp && ([event modifierFlags] & NSCommandKeyMask)) { // Cocoa won't send us key up event when releasing a key while Cmd is down, // so we have to do it ourselves. @@ -349,6 +353,33 @@ AWT_ASSERT_APPKIT_THREAD; } } +/* + * Posts the block to the AppKit event queue which will be executed + * on the main AppKit loop. + * While running nested loops this event will be ignored. + */ +- (void)postRunnableEvent:(void (^)())block +{ + void (^copy)() = [block copy]; + NSInteger encode = (NSInteger) copy; + [copy retain]; + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; + NSEvent* event = [NSEvent otherEventWithType: NSApplicationDefined + location: NSMakePoint(0,0) + modifierFlags: 0 + timestamp: 0 + windowNumber: 0 + context: nil + subtype: 777 + data1: encode + data2: 0]; + + [NSApp postEvent: event atStart: NO]; + [pool drain]; +} + + + - (void)postDummyEvent { seenDummyEventLock = [[NSConditionLock alloc] initWithCondition:NO]; dummyEventTimestamp = [NSProcessInfo processInfo].systemUptime; diff --git a/jdk/src/java.desktop/share/classes/com/sun/beans/introspect/PropertyInfo.java b/jdk/src/java.desktop/share/classes/com/sun/beans/introspect/PropertyInfo.java index ed5843ed40d..44d6a1f7919 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/beans/introspect/PropertyInfo.java +++ b/jdk/src/java.desktop/share/classes/com/sun/beans/introspect/PropertyInfo.java @@ -125,38 +125,36 @@ public final class PropertyInfo { put(Name.visualUpdate, annotation.visualUpdate()); put(Name.description, annotation.description()); String[] values = annotation.enumerationValues(); - if (0 < values.length) { - try { - Object[] array = new Object[3 * values.length]; - int index = 0; - for (String value : values) { - Class type = info.method.getDeclaringClass(); - String name = value; - int pos = value.lastIndexOf('.'); - if (pos > 0) { - name = value.substring(0, pos); - if (name.indexOf('.') < 0) { - String pkg = type.getName(); - name = pkg.substring(0, 1 + Math.max( - pkg.lastIndexOf('.'), - pkg.lastIndexOf('$'))) + name; - } - type = findClass(name); - name = value.substring(pos + 1); - } - Field field = type.getField(name); - if (Modifier.isStatic(field.getModifiers()) && info.type.isAssignableFrom(field.getType())) { - array[index++] = name; - array[index++] = field.get(null); - array[index++] = value; + try { + Object[] array = new Object[3 * values.length]; + int index = 0; + for (String value : values) { + Class type = info.method.getDeclaringClass(); + String name = value; + int pos = value.lastIndexOf('.'); + if (pos > 0) { + name = value.substring(0, pos); + if (name.indexOf('.') < 0) { + String pkg = type.getName(); + name = pkg.substring(0, 1 + Math.max( + pkg.lastIndexOf('.'), + pkg.lastIndexOf('$'))) + name; } + type = findClass(name); + name = value.substring(pos + 1); } - if (index == array.length) { - put(Name.enumerationValues, array); + Field field = type.getField(name); + if (Modifier.isStatic(field.getModifiers()) && info.type.isAssignableFrom(field.getType())) { + array[index++] = name; + array[index++] = field.get(null); + array[index++] = value; } - } catch (Exception ignored) { - ignored.printStackTrace(); } + if (index == array.length) { + put(Name.enumerationValues, array); + } + } catch (Exception ignored) { + ignored.printStackTrace(); } } } diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifBorders.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifBorders.java index 7a1b637850b..950f7d18b24 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifBorders.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifBorders.java @@ -41,7 +41,7 @@ import java.awt.Point; import java.awt.Rectangle; /** - * Factory object that can vend Icons appropriate for the basic L & F. + * Factory object that can vend Icons appropriate for the basic {@literal L & F}. *

    * Warning: * Serialized objects of this class will not be compatible with diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifButtonListener.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifButtonListener.java index 0e0f5d5ac9b..a1a74f1230f 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifButtonListener.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifButtonListener.java @@ -34,7 +34,6 @@ import javax.swing.event.*; /** * Button Listener - *

    * * @author Rich Schiavi */ diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifCheckBoxMenuItemUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifCheckBoxMenuItemUI.java index fea72f0fee3..7aa206b1fc5 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifCheckBoxMenuItemUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifCheckBoxMenuItemUI.java @@ -37,7 +37,6 @@ import java.awt.event.*; /** * MotifCheckboxMenuItem implementation - *

    * * @author Georges Saab * @author Rich Schiavi diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifComboBoxUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifComboBoxUI.java index fd8f885fb74..7e5c4701e11 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifComboBoxUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifComboBoxUI.java @@ -35,7 +35,8 @@ import java.beans.*; /** * ComboBox motif look and feel - *

    * Warning: + *

    + * Warning: * Serialized objects of this class will not be compatible with * future Swing releases. The current serialization support is appropriate * for short term storage or RMI between applications running the same @@ -261,9 +262,9 @@ public class MotifComboBoxUI extends BasicComboBoxUI implements Serializable { } /** - * This inner class is marked "public" due to a compiler bug. - * This class should be treated as a "protected" inner class. - * Instantiate it only within subclasses of . + * This inner class is marked "public" due to a compiler bug. + * This class should be treated as a "protected" inner class. + * Instantiate it only within subclasses of {@code }. */ public class ComboBoxLayoutManager extends BasicComboBoxUI.ComboBoxLayoutManager { public ComboBoxLayoutManager() { @@ -344,7 +345,7 @@ public class MotifComboBoxUI extends BasicComboBoxUI implements Serializable { } /** - * This class should be made "protected" in future releases. + * This class should be made "protected" in future releases. */ private class MotifPropertyChangeListener extends BasicComboBoxUI.PropertyChangeHandler { diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifInternalFrameUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifInternalFrameUI.java index bcd1cacfde9..8d9e5122ef6 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifInternalFrameUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifInternalFrameUI.java @@ -38,7 +38,7 @@ import javax.swing.plaf.*; /** - * A Motif L&F implementation of InternalFrame. + * A Motif {@literal L&F} implementation of InternalFrame. *

    * Warning: * Serialized objects of this class will not be compatible with diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifLabelUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifLabelUI.java index 22b224e13a7..1da0036e3fa 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifLabelUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifLabelUI.java @@ -32,7 +32,7 @@ import javax.swing.plaf.basic.BasicLabelUI; import javax.swing.plaf.ComponentUI; /** - * A Motif L&F implementation of LabelUI. + * A Motif {@literal L&F} implementation of LabelUI. * This merely sets up new default values in MotifLookAndFeel. *

    * Warning: diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuBarUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuBarUI.java index a2256895364..cdc05400fe2 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuBarUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuBarUI.java @@ -45,7 +45,7 @@ import javax.swing.plaf.basic.BasicMenuBarUI; import javax.swing.plaf.basic.*; /** - * A Windows L&F implementation of MenuBarUI. This implementation + * A Windows {@literal L&F} implementation of MenuBarUI. This implementation * is a "combined" view/controller. *

    * Warning: diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuItemUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuItemUI.java index c11ad6c4e05..52116aaf588 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuItemUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuItemUI.java @@ -37,7 +37,6 @@ import javax.swing.plaf.basic.BasicMenuItemUI; /** * MotifMenuItem implementation - *

    * * @author Rich Schiavi * @author Georges Saab diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuUI.java index fd32fd0db48..c69e9df7c65 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifMenuUI.java @@ -36,8 +36,7 @@ import javax.swing.plaf.basic.*; import javax.swing.plaf.basic.BasicMenuUI; /** - * A Motif L&F implementation of MenuUI. - *

    + * A Motif {@literal L&F} implementation of MenuUI. * * @author Georges Saab * @author Rich Schiavi diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifPopupMenuSeparatorUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifPopupMenuSeparatorUI.java index bd3aa15d6cb..164b3227034 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifPopupMenuSeparatorUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifPopupMenuSeparatorUI.java @@ -34,8 +34,8 @@ import java.awt.Rectangle; import javax.swing.plaf.*; /** - * A Motif L&F implementation of PopupMenuSeparatorUI. This implementation - * is a "combined" view/controller. + * A Motif {@literal L&F} implementation of PopupMenuSeparatorUI. + * This implementation is a "combined" view/controller. * * @author Jeff Shapiro */ diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifPopupMenuUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifPopupMenuUI.java index f34c45e6d80..402bcc528b1 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifPopupMenuUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifPopupMenuUI.java @@ -47,7 +47,7 @@ import javax.swing.plaf.basic.BasicPopupMenuUI; /** - * A Motif L&F implementation of PopupMenuUI. + * A Motif {@literal L&F} implementation of PopupMenuUI. *

    * Warning: * Serialized objects of this class will not be compatible with diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifScrollPaneUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifScrollPaneUI.java index 52bc7385518..8cb5028c476 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifScrollPaneUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifScrollPaneUI.java @@ -34,7 +34,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; /** - * A CDE/Motif L&F implementation of ScrollPaneUI. + * A CDE/Motif {@code L&F} implementation of ScrollPaneUI. *

    * Warning: * Serialized objects of this class will not be compatible with diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifSeparatorUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifSeparatorUI.java index db6033fd4a9..bc457b01b13 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifSeparatorUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifSeparatorUI.java @@ -35,8 +35,8 @@ import javax.swing.plaf.*; import javax.swing.plaf.basic.BasicSeparatorUI; /** - * A Motif L&F implementation of SeparatorUI. This implementation - * is a "combined" view/controller. + * A Motif {@literal L&F} implementation of SeparatorUI. + * This implementation is a "combined" view/controller. *

    * Warning: * Serialized objects of this class will not be compatible with diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifTabbedPaneUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifTabbedPaneUI.java index ce2408ff623..e7bae098a55 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifTabbedPaneUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifTabbedPaneUI.java @@ -34,7 +34,7 @@ import javax.swing.plaf.basic.BasicTabbedPaneUI; import java.io.Serializable; /** - * A Motif L&F implementation of TabbedPaneUI. + * A Motif {@literal L&F} implementation of TabbedPaneUI. *

    * Warning: * Serialized objects of this class will not be compatible with diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/DesktopProperty.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/DesktopProperty.java index f4058eeeb8b..ab6aa617222 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/DesktopProperty.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/DesktopProperty.java @@ -199,7 +199,7 @@ public class DesktopProperty implements UIDefaults.ActiveValue { /** * Requests that all components in the GUI hierarchy be updated - * to reflect dynamic changes in this look&feel. This update occurs + * to reflect dynamic changes in this {@literal look&feel}. This update occurs * by uninstalling and re-installing the UI objects. Requests are * batched and collapsed into a single update pass because often * many desktop properties will change at once. diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsBorders.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsBorders.java index ca840ca0c42..1e10ccce1bf 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsBorders.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsBorders.java @@ -39,7 +39,7 @@ import static com.sun.java.swing.plaf.windows.TMSchema.*; import static com.sun.java.swing.plaf.windows.XPStyle.Skin; /** - * Factory object that can vend Borders appropriate for the Windows 95 L & F. + * Factory object that can vend Borders appropriate for the Windows 95 {@literal L & F}. * @author Rich Schiavi */ @@ -142,7 +142,7 @@ public class WindowsBorders { /** * A border for the ToolBar. If the ToolBar is floatable then the handle grip is drawn - *

    + * * @since 1.4 */ @SuppressWarnings("serial") // Superclass is not serializable across versions diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsCheckBoxMenuItemUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsCheckBoxMenuItemUI.java index ab1a1bce0b6..99966cb210e 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsCheckBoxMenuItemUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsCheckBoxMenuItemUI.java @@ -76,7 +76,7 @@ public class WindowsCheckBoxMenuItemUI extends BasicCheckBoxMenuItemUI { } /** * Method which renders the text of the current menu item. - *

    + * * @param g Graphics context * @param menuItem Current menu item to render * @param textRect Bounding rectangle to render the text. diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java index 8e2e1489580..ca9121c225d 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsFileChooserUI.java @@ -48,7 +48,7 @@ import sun.swing.*; import javax.accessibility.*; /** - * Windows L&F implementation of a FileChooser. + * Windows {@literal L&F} implementation of a FileChooser. * * @author Jeff Dinkins */ diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java index 8e168066d11..4bc8f0b612e 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsGraphicsUtils.java @@ -47,7 +47,7 @@ public class WindowsGraphicsUtils { * Renders a text String in Windows without the mnemonic. * This is here because the WindowsUI hierarchy doesn't match the Component hierarchy. All * the overriden paintText methods of the ButtonUI delegates will call this static method. - *

    + * * @param g Graphics context * @param b Current button to render * @param textRect Bounding rectangle to render the text. diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java index 55c79c43906..4faeba214aa 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsIconFactory.java @@ -38,7 +38,7 @@ import static com.sun.java.swing.plaf.windows.XPStyle.Skin; import sun.swing.MenuItemCheckIconFactory; /** - * Factory object that can vend Icons appropriate for the Windows L & F. + * Factory object that can vend Icons appropriate for the Windows {@literal L & F}. *

    * Warning: * Serialized objects of this class will not be compatible with diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java index f86f5964693..83717d6bf93 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsInternalFrameTitlePane.java @@ -503,7 +503,7 @@ public class WindowsInternalFrameTitlePane extends BasicInternalFrameTitlePane { private Icon[] icons; /** - * @params objects an array of Icon or UIDefaults.LazyValue + * @param objects an array of Icon or UIDefaults.LazyValue *

    * The constructor is public so it can be called by UIDefaults.ProxyLazyValue. */ diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java index dddbeeb5074..578615829ec 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuItemUI.java @@ -70,7 +70,7 @@ public class WindowsMenuItemUI extends BasicMenuItemUI { /** * Method which renders the text of the current menu item. - *

    + * * @param g Graphics context * @param menuItem Current menu item to render * @param textRect Bounding rectangle to render the text. diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuUI.java index a2e7795cfe3..803952b8011 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsMenuUI.java @@ -199,7 +199,7 @@ public class WindowsMenuUI extends BasicMenuUI { /** * Method which renders the text of the current menu item. - *

    + * * @param g Graphics context * @param menuItem Current menu item to render * @param textRect Bounding rectangle to render the text. diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuSeparatorUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuSeparatorUI.java index f040812a26d..ed31f00a89b 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuSeparatorUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsPopupMenuSeparatorUI.java @@ -36,7 +36,7 @@ import com.sun.java.swing.plaf.windows.TMSchema.State; import com.sun.java.swing.plaf.windows.XPStyle.Skin; /** - * Windows L&F implementation of PopupMenuSeparatorUI. + * Windows {@literal L&F} implementation of PopupMenuSeparatorUI. * * @author Leif Samuelsson * @author Igor Kushnirskiy diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsRadioButtonMenuItemUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsRadioButtonMenuItemUI.java index c43876f38b4..cce34eb9a65 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsRadioButtonMenuItemUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsRadioButtonMenuItemUI.java @@ -76,7 +76,7 @@ public class WindowsRadioButtonMenuItemUI extends BasicRadioButtonMenuItemUI { /** * Method which renders the text of the current menu item. - *

    + * * @param g Graphics context * @param menuItem Current menu item to render * @param textRect Bounding rectangle to render the text. diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsSeparatorUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsSeparatorUI.java index 1f0ece18046..65526a40c1b 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsSeparatorUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsSeparatorUI.java @@ -29,7 +29,5 @@ import javax.swing.plaf.basic.*; /** * Windows Separator. - *

    - * */ public class WindowsSeparatorUI extends BasicSeparatorUI { } diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsToolBarSeparatorUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsToolBarSeparatorUI.java index 997fc905403..ffd6daa3ad8 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsToolBarSeparatorUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsToolBarSeparatorUI.java @@ -37,7 +37,6 @@ import static com.sun.java.swing.plaf.windows.XPStyle.Skin; /** * Draws Windows toolbar separators. - *

    * * @author Mark Davidson */ diff --git a/jdk/src/java.desktop/share/classes/java/awt/ScrollPane.java b/jdk/src/java.desktop/share/classes/java/awt/ScrollPane.java index 3d5a8b9cd1e..65eaed68924 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/ScrollPane.java +++ b/jdk/src/java.desktop/share/classes/java/awt/ScrollPane.java @@ -499,9 +499,8 @@ public class ScrollPane extends Container implements Accessible { Point p = getScrollPosition(); Dimension cs = calculateChildSize(); Dimension vs = getViewportSize(); - Insets i = getInsets(); - c.reshape(i.left - p.x, i.top - p.y, cs.width, cs.height); + c.reshape(- p.x, - p.y, cs.width, cs.height); ScrollPanePeer peer = (ScrollPanePeer)this.peer; if (peer != null) { peer.childResized(cs.width, cs.height); diff --git a/jdk/src/java.desktop/share/classes/java/beans/BeanDescriptor.java b/jdk/src/java.desktop/share/classes/java/beans/BeanDescriptor.java index 276c027c226..e0428abb3b9 100644 --- a/jdk/src/java.desktop/share/classes/java/beans/BeanDescriptor.java +++ b/jdk/src/java.desktop/share/classes/java/beans/BeanDescriptor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -81,10 +81,7 @@ public class BeanDescriptor extends FeatureDescriptor { SwingContainer container = beanClass.getAnnotation(SwingContainer.class); if (container != null) { setValue("isContainer", container.value()); - String delegate = container.delegate(); - if (!delegate.isEmpty()) { - setValue("containerDelegate", delegate); - } + setValue("containerDelegate", container.delegate()); } } diff --git a/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/MultipleDocumentHandling.java b/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/MultipleDocumentHandling.java index c7f5f5e7664..f3e02845159 100644 --- a/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/MultipleDocumentHandling.java +++ b/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/MultipleDocumentHandling.java @@ -70,8 +70,8 @@ import javax.print.attribute.PrintJobAttribute; * The standard MultipleDocumentHandling values are: *