Merge
This commit is contained in:
commit
d60d6fdf40
2
.hgtags
2
.hgtags
@ -310,3 +310,5 @@ e7dbbef69d12b6a74dfad331b7188e7f893e8d29 jdk9-b62
|
||||
4915246064b2f89d5f00c96e758686b7fdad36a6 jdk9-b65
|
||||
ff3fc75f3214ad7e03595be1b0d0f38d887b6f0e jdk9-b66
|
||||
56166ce66037952fa21e9f680b31bf8eb47312c0 jdk9-b67
|
||||
5b500c93ce4822d47061cd518ff3f72d9d8cb5b5 jdk9-b68
|
||||
d69c968463f0ae5d0b45de3fc14fe65171b23948 jdk9-b69
|
||||
|
@ -310,3 +310,5 @@ ea38728b4f4bdd8fd0d7a89b18069f521cf05013 jdk9-b61
|
||||
7c31f9d7b932f7924f1258d52885b1c7c3e078c2 jdk9-b65
|
||||
dc6e8336f51bb6b67b7245766179eab5ca7720b4 jdk9-b66
|
||||
f546760134eb861fcfecd4ce611b0040b0d25a6a jdk9-b67
|
||||
70e4272790b6199e9ca89df2758ff9cb58ec4125 jdk9-b68
|
||||
1bcfd6b8726582cff5a42dbfc75903e36f9dd4fe jdk9-b69
|
||||
|
@ -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
|
||||
])
|
||||
|
||||
|
7
common/autoconf/build-aux/config.guess
vendored
7
common/autoconf/build-aux/config.guess
vendored
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
@ -310,3 +310,5 @@ d27f7e0a7aca129969de23e9934408a31b4abf4c jdk9-b62
|
||||
afc1e295c4bf83f9a5dd539c29914edd4a754a3f jdk9-b65
|
||||
44ee68f7dbacab24a45115fd6a8ccdc7eb6e8f0b jdk9-b66
|
||||
4418697e56f1f43597f55c7cb6573549c6117868 jdk9-b67
|
||||
8efad64f40eb8cd4df376c0a5275892eeb396bbd jdk9-b68
|
||||
de8acedcb5b5870f1dc54cba575aaa5d33897ea2 jdk9-b69
|
||||
|
@ -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 <tt>Bounds</tt>.
|
||||
* For more information on Helper files, see
|
||||
* <a href="doc-files/generatedfiles.html#helper">
|
||||
* "Generated Files: Helper Files"</a>.<P>
|
||||
*/
|
||||
|
||||
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 ());
|
||||
}
|
||||
|
||||
}
|
@ -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 <code>DynAny</code> object whose contents
|
||||
* are assigned to this <code>DynAny</code>.
|
||||
* @throws Invalid if the source <code>DynAny</code> is
|
||||
* invalid
|
||||
* @throws org.omg.CORBA.DynAnyPackage.Invalid if the source
|
||||
* <code>DynAny</code> 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 <code>Any</code> object.
|
||||
* @throws Invalid if the source <code>Any</code> object is
|
||||
* empty or bad
|
||||
* @throws org.omg.CORBA.DynAnyPackage.Invalid if the source
|
||||
* <code>Any</code> 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 <code>Any</code> object.
|
||||
* @throws Invalid if this <code>DynAny</code> is empty or
|
||||
* bad.
|
||||
* @throws org.omg.CORBA.DynAnyPackage.Invalid if this
|
||||
* <code>DynAny</code> is empty or bad.
|
||||
* created or does not contain a meaningful value
|
||||
*/
|
||||
public org.omg.CORBA.Any to_any()
|
||||
|
@ -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
|
||||
* <code>DynArray</code> object to the given array.
|
||||
*
|
||||
* @param value the array of <code>Any</code> 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)
|
||||
|
@ -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 <code>Any</code> 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)
|
||||
|
@ -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
|
||||
* <tt>ORBPackage/InvalidName</tt>.
|
||||
* For more information on Helper files, see
|
||||
* <a href="doc-files/generatedfiles.html#helper">
|
||||
* "Generated Files: Helper Files"</a>.<P>
|
||||
*/
|
||||
|
||||
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 ());
|
||||
}
|
||||
|
||||
}
|
@ -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 <code>Any</code> 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 <code>Any</code> object containing the exception
|
||||
* @exception BAD_PARAM if the given <code>Any</code> 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 <a href="package-summary.html#unimpl"><code>CORBA</code>
|
||||
|
@ -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
|
||||
* <tt>TypeCodePackage/BadKind</tt>.
|
||||
* For more information on Helper files, see
|
||||
* <a href="doc-files/generatedfiles.html#helper">
|
||||
* "Generated Files: Helper Files"</a>.<P>
|
||||
*/
|
||||
|
||||
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 ());
|
||||
}
|
||||
|
||||
}
|
@ -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
|
||||
* <tt>TypeCodePackage/Bounds</tt>.
|
||||
* For more information on Helper files, see
|
||||
* <a href="doc-files/generatedfiles.html#helper">
|
||||
* "Generated Files: Helper Files"</a>.<P>
|
||||
*/
|
||||
|
||||
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 ());
|
||||
}
|
||||
|
||||
}
|
@ -470,3 +470,5 @@ bf92b8db249cdfa5651ef954b6c0743a7e0ea4cd jdk9-b64
|
||||
e7ae94c4f35e940ea423fc1dd260435df34a77c0 jdk9-b65
|
||||
197e94e0dacddd16816f101d24fc0442ab518326 jdk9-b66
|
||||
d47dfabd16d48eb96a451edd1b61194a39ee0eb5 jdk9-b67
|
||||
11af3990d56c97b40318bc1f20608e86f051a3f7 jdk9-b68
|
||||
ff0929a59ced0e144201aa05819ae2e47d6f2c61 jdk9-b69
|
||||
|
@ -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
|
||||
|
@ -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) {
|
||||
|
@ -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),
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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))
|
||||
|
@ -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,
|
||||
|
@ -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;") \
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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-------------------------------
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
71
hotspot/test/compiler/arraycopy/TestLoadBypassArrayCopy.java
Normal file
71
hotspot/test/compiler/arraycopy/TestLoadBypassArrayCopy.java
Normal file
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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;
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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
|
@ -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));
|
||||
}
|
||||
}
|
@ -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(
|
@ -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,
|
@ -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,
|
109
hotspot/test/compiler/jsr292/PollutedTrapCounts.java
Normal file
109
hotspot/test/compiler/jsr292/PollutedTrapCounts.java
Normal file
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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,
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -310,3 +310,5 @@ f4a4a54620370f077c2e830a5561c8cfa811712b jdk9-b61
|
||||
ae7406e82828fe1c245ac7507a9da5fd5b1c9529 jdk9-b65
|
||||
d5963ccce28d7a3e96ee3e2dc8a8676e61699b70 jdk9-b66
|
||||
78c2685daabafae827c686ca2d1bb2e451faed2b jdk9-b67
|
||||
82aae947938ec9b0119fdd78a616d0b7263072ee jdk9-b68
|
||||
f844a908d3308f47d73cf64e87c98d37d5d76ce8 jdk9-b69
|
||||
|
@ -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(){
|
||||
|
@ -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). */
|
||||
|
@ -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) { }
|
||||
}
|
@ -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
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -1,3 +1,6 @@
|
||||
# jaxp test uses TestNG
|
||||
TestNG.dirs = .
|
||||
|
||||
# Declare module dependency
|
||||
modules=java.xml
|
||||
|
||||
|
@ -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 <xi:include> 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;
|
||||
|
@ -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;
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
<?xml version="1.0"?>
|
||||
<my_lax>
|
||||
<my_int>25.5</my_int>
|
||||
</my_lax>
|
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0"?>
|
||||
<my_strict>
|
||||
<my_int>255</my_int>
|
||||
<my_skip>
|
||||
<my_int>2.55</my_int>
|
||||
<un_define/>
|
||||
<my_lax>
|
||||
<my_int>25.5</my_int>
|
||||
</my_lax>
|
||||
<my_strict>
|
||||
<un_define>TTT</un_define>
|
||||
</my_strict>
|
||||
</my_skip>
|
||||
<my_lax>
|
||||
<my_int>2555</my_int>
|
||||
<un_define>TTT</un_define>
|
||||
<my_strict>
|
||||
<my_int>20</my_int>
|
||||
</my_strict>
|
||||
</my_lax>
|
||||
</my_strict>
|
@ -0,0 +1,34 @@
|
||||
<?xml version="1.0"?>
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
|
||||
|
||||
<xs:element name="my_lax">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:any processContents="lax" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
<xs:element name="my_skip">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:any processContents="skip" maxOccurs="unbounded"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
<xs:element name="my_strict">
|
||||
<xs:complexType>
|
||||
<xs:sequence>
|
||||
<xs:any maxOccurs="unbounded"/> <!-- by default, processContents="strict" -->
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:element>
|
||||
|
||||
<xs:element name="my_int">
|
||||
<xs:simpleType>
|
||||
<xs:restriction base="xs:int"/>
|
||||
</xs:simpleType>
|
||||
</xs:element>
|
||||
|
||||
</xs:schema>
|
@ -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() {
|
||||
|
||||
|
@ -313,3 +313,5 @@ df100399ed27d0eaa57c137ca99819a0fee66178 jdk9-b64
|
||||
45ef73bb85c12ec1b291835c1d40e342a454e3f0 jdk9-b65
|
||||
1232f4013417e4a9cd291096798d10f2e601d69d jdk9-b66
|
||||
c9785bc8ade98a16a050d7520b70c68363857e00 jdk9-b67
|
||||
b5878b03d1b2e105917d959fbfa3c57c22495803 jdk9-b68
|
||||
f5911c6155c29ac24b6f9068273207e5ebd3a3df jdk9-b69
|
||||
|
@ -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<JAXBException> EXCEPTION_HANDLER =
|
||||
new ServiceLoaderUtil.ExceptionHandler<JAXBException>() {
|
||||
@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<String, ?> 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 {
|
||||
|
@ -45,29 +45,20 @@ import java.io.InputStream;
|
||||
* specialized forms of the method available:
|
||||
*
|
||||
* <ul>
|
||||
* <li>{@link #newInstance(String,ClassLoader) JAXBContext.newInstance( "com.acme.foo:com.acme.bar" )} <br>
|
||||
* The JAXBContext instance is initialized from a list of colon
|
||||
* separated Java package names. Each java package contains
|
||||
* JAXB mapped classes, schema-derived classes and/or user annotated
|
||||
* classes. Additionally, the java package may contain JAXB package annotations
|
||||
* that must be processed. (see JLS, Section 7.4.1 "Named Packages").
|
||||
* </li>
|
||||
* <li>{@link #newInstance(Class...) JAXBContext.newInstance( com.acme.foo.Foo.class )} <br>
|
||||
* The JAXBContext instance is initialized with class(es)
|
||||
* passed as parameter(s) and classes that are statically reachable from
|
||||
* these class(es). See {@link #newInstance(Class...)} for details.
|
||||
* </li>
|
||||
* <li>{@link #newInstance(String, ClassLoader) JAXBContext.newInstance( "com.acme.foo:com.acme.bar" )} <br>
|
||||
* The JAXBContext instance is initialized from a list of colon
|
||||
* separated Java package names. Each java package contains
|
||||
* JAXB mapped classes, schema-derived classes and/or user annotated
|
||||
* classes. Additionally, the java package may contain JAXB package annotations
|
||||
* that must be processed. (see JLS, Section 7.4.1 "Named Packages").
|
||||
* </li>
|
||||
* <li>{@link #newInstance(Class...) JAXBContext.newInstance( com.acme.foo.Foo.class )} <br>
|
||||
* The JAXBContext instance is initialized with class(es)
|
||||
* passed as parameter(s) and classes that are statically reachable from
|
||||
* these class(es). See {@link #newInstance(Class...)} for details.
|
||||
* </li>
|
||||
* </ul>
|
||||
*
|
||||
* <p>
|
||||
* <i><B>SPEC REQUIREMENT:</B> the provider must supply an implementation
|
||||
* class containing the following method signatures:</i>
|
||||
*
|
||||
* <pre>{@code
|
||||
* 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
|
||||
* }</pre>
|
||||
*
|
||||
* <p><i>
|
||||
* 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 <tt>contextPath</tt>. For example:
|
||||
*
|
||||
* <pre>
|
||||
* 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
|
||||
* </pre>
|
||||
*
|
||||
* <p>
|
||||
@ -146,7 +137,7 @@ import java.io.InputStream;
|
||||
* Section 4.2 <i>Java Package</i> of the specification.
|
||||
*
|
||||
* <p>
|
||||
* <i><B>SPEC REQUIREMENT:</B> the provider must generate a class in each
|
||||
* <i>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
|
||||
* <tt>newInstance( javaContentInterface )</tt> method</i>
|
||||
@ -214,6 +205,7 @@ import java.io.InputStream;
|
||||
* by the following steps.
|
||||
*
|
||||
* <ol>
|
||||
*
|
||||
* <li>
|
||||
* For each package/class explicitly passed in to the {@link #newInstance} method, in the order they are specified,
|
||||
* <tt>jaxb.properties</tt> file is looked up in its package, by using the associated classloader —
|
||||
@ -223,7 +215,7 @@ import java.io.InputStream;
|
||||
* <p>
|
||||
* 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.
|
||||
*
|
||||
* <p>
|
||||
* 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.
|
||||
*
|
||||
* <li>
|
||||
* Look for <tt>/META-INF/services/javax.xml.bind.JAXBContext</tt> 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.
|
||||
* <br>
|
||||
* In case of {@link java.util.ServiceConfigurationError service
|
||||
* configuration error} a {@link javax.xml.bind.JAXBException} will be thrown.
|
||||
* </li>
|
||||
*
|
||||
* <li>
|
||||
* 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:
|
||||
*
|
||||
* <pre>
|
||||
*
|
||||
* 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
|
||||
* </pre>
|
||||
* This configuration method is deprecated.
|
||||
*
|
||||
* <li>
|
||||
* 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;
|
||||
* </ol>
|
||||
*
|
||||
* <p>
|
||||
* Once the provider factory class is discovered, its
|
||||
* <tt>public static JAXBContext createContext(String,ClassLoader,Map)</tt> method
|
||||
* (see {@link #newInstance(String, ClassLoader, Map)} for the parameter semantics.)
|
||||
* or <tt>public static JAXBContext createContet(Class[],Map)</tt> 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 <ul><li>Ryan Shoemaker, Sun Microsystems, Inc.</li><li>Kohsuke Kawaguchi, Sun Microsystems, Inc.</li><li>Joe Fialli, Sun Microsystems, Inc.</li></ul>
|
||||
* <p/>
|
||||
*
|
||||
* @apiNote
|
||||
* <p>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 <ul><li>Ryan Shoemaker, Sun Microsystems, Inc.</li>
|
||||
* <li>Kohsuke Kawaguchi, Sun Microsystems, Inc.</li>
|
||||
* <li>Joe Fialli, Sun Microsystems, Inc.</li></ul>
|
||||
*
|
||||
* @see Marshaller
|
||||
* @see Unmarshaller
|
||||
* @see <a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.4.1">S 7.4.1 "Named Packages" in Java Language Specification</a>
|
||||
* @see <a href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.4.1">S 7.4.1 "Named Packages"
|
||||
* in Java Language Specification</a>
|
||||
*
|
||||
* @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 <tt>JAXBContext</tt> 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 {
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Obtain a new instance of a <tt>JAXBContext</tt> class.
|
||||
* Create a new instance of a <tt>JAXBContext</tt> class.
|
||||
*
|
||||
* <p>
|
||||
* This is a convenience method to invoke the
|
||||
@ -300,7 +329,7 @@ public abstract class JAXBContext {
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Obtain a new instance of a <tt>JAXBContext</tt> class.
|
||||
* Create a new instance of a <tt>JAXBContext</tt> class.
|
||||
*
|
||||
* <p>
|
||||
* The client application must supply a context path which is a list of
|
||||
@ -396,7 +425,7 @@ public abstract class JAXBContext {
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Obtain a new instance of a <tt>JAXBContext</tt> class.
|
||||
* Create a new instance of a <tt>JAXBContext</tt> class.
|
||||
*
|
||||
* <p>
|
||||
* This is mostly the same as {@link JAXBContext#newInstance(String, ClassLoader)},
|
||||
@ -425,8 +454,9 @@ public abstract class JAXBContext {
|
||||
* </ol>
|
||||
* @since 1.6, JAXB 2.0
|
||||
*/
|
||||
public static JAXBContext newInstance( String contextPath, ClassLoader classLoader, Map<String,?> properties )
|
||||
throws JAXBException {
|
||||
public static JAXBContext newInstance( String contextPath,
|
||||
ClassLoader classLoader,
|
||||
Map<String,?> 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
|
||||
// /**
|
||||
// * <p>
|
||||
// * Obtain a new instance of a <tt>JAXBContext</tt> class.
|
||||
// * Create a new instance of a <tt>JAXBContext</tt> class.
|
||||
// *
|
||||
// * <p>
|
||||
// * 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 <tt>JAXBContext</tt>. Always non-null valid object.
|
||||
// * A new instance of a <tt>JAXBContext</tt>.
|
||||
// *
|
||||
// * @throws JAXBException
|
||||
// * if an error was encountered while creating the
|
||||
@ -517,7 +547,7 @@ public abstract class JAXBContext {
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Obtain a new instance of a <tt>JAXBContext</tt> class.
|
||||
* Create a new instance of a <tt>JAXBContext</tt> class.
|
||||
*
|
||||
* <p>
|
||||
* 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 <tt>JAXBContext</tt>. Always non-null valid object.
|
||||
* A new instance of a <tt>JAXBContext</tt>.
|
||||
*
|
||||
* @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.<String,Object>emptyMap());
|
||||
@ -586,7 +616,7 @@ public abstract class JAXBContext {
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Obtain a new instance of a <tt>JAXBContext</tt> class.
|
||||
* Create a new instance of a <tt>JAXBContext</tt> class.
|
||||
*
|
||||
* <p>
|
||||
* 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 <tt>JAXBContext</tt>. Always non-null valid object.
|
||||
* A new instance of a <tt>JAXBContext</tt>.
|
||||
*
|
||||
* @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<String,?> properties )
|
||||
public static JAXBContext newInstance( Class<?>[] classesToBeBound, Map<String,?> 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<ClassLoader>() {
|
||||
public ClassLoader run() {
|
||||
return Thread.currentThread().getContextClassLoader();
|
||||
}
|
||||
});
|
||||
|
@ -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;
|
||||
|
||||
/**
|
||||
* <p>Factory that creates new <code>JAXBContext</code> instances.
|
||||
*
|
||||
* JAXBContextFactory can be located using {@link java.util.ServiceLoader#load(Class)}
|
||||
*
|
||||
* @since 1.9, JAXB 2.3
|
||||
*/
|
||||
public interface JAXBContextFactory {
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Create a new instance of a <tt>JAXBContext</tt> class.
|
||||
*
|
||||
* <p>
|
||||
* 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 <tt>JAXBContext</tt>.
|
||||
*
|
||||
* @throws JAXBException
|
||||
* if an error was encountered while creating the
|
||||
* <tt>JAXBContext</tt>, such as (but not limited to):
|
||||
* <ol>
|
||||
* <li>Classes use JAXB annotations incorrectly
|
||||
* <li>Classes have colliding annotations (i.e., two classes with the same type name)
|
||||
* <li>The JAXB implementation was unable to locate
|
||||
* provider-specific out-of-band information (such as additional
|
||||
* files generated at the development time.)
|
||||
* </ol>
|
||||
*
|
||||
* @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<String, ?> properties ) throws JAXBException;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Create a new instance of a <tt>JAXBContext</tt> class.
|
||||
*
|
||||
* <p>
|
||||
* For semantics see {@link javax.xml.bind.JAXBContext#newInstance(String, ClassLoader, java.util.Map)}
|
||||
*
|
||||
* <p>
|
||||
* The interpretation of properties is up to implementations. Implementations should
|
||||
* throw <tt>JAXBException</tt> 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 <tt>JAXBContext</tt>
|
||||
* @throws JAXBException if an error was encountered while creating the
|
||||
* <tt>JAXBContext</tt> such as
|
||||
* <ol>
|
||||
* <li>failure to locate either ObjectFactory.class or jaxb.index in the packages</li>
|
||||
* <li>an ambiguity among global elements contained in the contextPath</li>
|
||||
* <li>failure to locate a value for the context factory provider property</li>
|
||||
* <li>mixing schema derived packages from different providers on the same contextPath</li>
|
||||
* </ol>
|
||||
* @since 1.9, JAXB 2.3
|
||||
*/
|
||||
JAXBContext createContext(String contextPath,
|
||||
ClassLoader classLoader,
|
||||
Map<String, ?> properties ) throws JAXBException;
|
||||
|
||||
}
|
@ -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> P firstByServiceLoader(Class<P> spiClass, Logger logger) {
|
||||
static <P, T extends Exception> P firstByServiceLoader(Class<P> spiClass,
|
||||
Logger logger,
|
||||
ExceptionHandler<T> handler) throws T {
|
||||
// service discovery
|
||||
ServiceLoader<P> serviceLoader = ServiceLoader.load(spiClass);
|
||||
for (P impl : serviceLoader) {
|
||||
logger.fine("ServiceProvider loading Facility used; returning object [" + impl.getClass().getName() + "]");
|
||||
return impl;
|
||||
try {
|
||||
ServiceLoader<P> 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 <T> 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 <T extends Exception> Object newInstance(String className, String defaultImplClassName, final ExceptionHandler<T> 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 <T extends Exception> Object newInstance(String className,
|
||||
String defaultImplClassName,
|
||||
final ExceptionHandler<T> 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<String>() {
|
||||
@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();
|
||||
|
@ -310,3 +310,5 @@ fd3281c400347088b36aeb16273aa679d53a81a4 jdk9-b63
|
||||
ed94f3e7ba6bbfec0772de6d24e39543e13f6d88 jdk9-b65
|
||||
4fbcca8ab812198c7fb747ea7b213b6e404f36e9 jdk9-b66
|
||||
1abd45df5480a04bff98fba1851d66a5230e67d4 jdk9-b67
|
||||
046fd17bb9a0cdf6681124866df9626d17b0516a jdk9-b68
|
||||
551323004d0ce2f1d4b0e99552f7e0cdcebc6fca jdk9-b69
|
||||
|
@ -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), \
|
||||
|
@ -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, \
|
||||
|
@ -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), \
|
||||
|
@ -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, \
|
||||
|
@ -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) \
|
||||
|
@ -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, \
|
||||
|
@ -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, \
|
||||
|
@ -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), \
|
||||
|
@ -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), \
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
* <P>
|
||||
*
|
||||
* <table border=1 cellpadding=5>
|
||||
* <tr>
|
||||
|
@ -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.
|
||||
* <p>
|
||||
*
|
||||
* @serialData Default fields followed by separator character.
|
||||
*/
|
||||
private synchronized void writeObject(java.io.ObjectOutputStream s)
|
||||
|
@ -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 {
|
||||
* <code>null</code> and is implied by this object,
|
||||
* <code>false</code> 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,
|
||||
* <code>false</code> 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<Permission> perms;
|
||||
private transient ConcurrentHashMap<String, Permission> 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<Permission> 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<Permission> permissions = new Vector<>(perms.size());
|
||||
synchronized (this) {
|
||||
permissions.addAll(perms);
|
||||
}
|
||||
Vector<Permission> 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<Permission> permissions = (Vector<Permission>)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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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(
|
||||
|
@ -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.
|
||||
* <p>
|
||||
*
|
||||
* @apiNote
|
||||
* Using {@link #onExit() onExit} is an alternative to
|
||||
* {@link #waitFor() waitFor} that enables both additional concurrency
|
||||
|
@ -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.
|
||||
* <p>
|
||||
*
|
||||
* @implSpec
|
||||
* In the case where ProcessHandles cannot be supported then the factory
|
||||
* methods must consistently throw {@link java.lang.UnsupportedOperationException}.
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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<D extends GenericDeclaration> 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}.
|
||||
*
|
||||
* <p>For each upper bound B: <ul> <li>if B is a parameterized
|
||||
@ -67,7 +67,7 @@ public interface TypeVariable<D extends GenericDeclaration> 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<D extends GenericDeclaration> 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();
|
||||
|
@ -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}.
|
||||
*
|
||||
* <p>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.
|
||||
*
|
||||
|
@ -1963,6 +1963,43 @@ public class BigInteger extends Number implements Comparable<BigInteger> {
|
||||
* 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<BigInteger> {
|
||||
* 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<BigInteger> {
|
||||
* 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;
|
||||
|
||||
|
@ -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 <i>obj</i> 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<SocketPermission> perms;
|
||||
// A ConcurrentSkipListMap is used to preserve order, so that most
|
||||
// recently added permissions are checked first (see JDK-4301064).
|
||||
private transient ConcurrentSkipListMap<String, SocketPermission> 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<Permission> elements() {
|
||||
// Convert Iterator into Enumeration
|
||||
synchronized (this) {
|
||||
return Collections.enumeration((List<Permission>)(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<SocketPermission> permissions = new Vector<>(perms.size());
|
||||
|
||||
synchronized (this) {
|
||||
permissions.addAll(perms);
|
||||
}
|
||||
Vector<SocketPermission> 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<SocketPermission> permissions = (Vector<SocketPermission>)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<String> {
|
||||
@Override
|
||||
public int compare(String s1, String s2) {
|
||||
if (s1.equals(s2)) {
|
||||
return 0;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<String, Permission> perms;
|
||||
private transient ConcurrentHashMap<String, Permission> 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<Permission> 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<String, Permission> 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<String, Permission> permissions =
|
||||
(Hashtable<String, Permission>)gfields.get("permissions", null);
|
||||
perms = new HashMap<>(permissions.size()*2);
|
||||
perms = new ConcurrentHashMap<>(permissions.size()*2);
|
||||
perms.putAll(permissions);
|
||||
|
||||
// Get all_allowed
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user