提交 00d8ed15 编写于 作者: D duke

Merge

...@@ -213,3 +213,4 @@ e1a929afcfc492470d50be0b6b0e8dc77d3760b9 jdk8-b88 ...@@ -213,3 +213,4 @@ e1a929afcfc492470d50be0b6b0e8dc77d3760b9 jdk8-b88
892a0196d10c67f3a12f0eefb0bb536e423d8868 jdk8-b89 892a0196d10c67f3a12f0eefb0bb536e423d8868 jdk8-b89
69b773a221b956a3386933ecdbfeccee0edeac47 jdk8-b90 69b773a221b956a3386933ecdbfeccee0edeac47 jdk8-b90
cb51fb4789ac0b8be4056482077ddfb8f3bd3805 jdk8-b91 cb51fb4789ac0b8be4056482077ddfb8f3bd3805 jdk8-b91
3a36c926a7aafa9d4a892a45ef3678e87ad8359b jdk8-b92
...@@ -72,7 +72,7 @@ AC_DEFUN([BASIC_FIXUP_PATH], ...@@ -72,7 +72,7 @@ AC_DEFUN([BASIC_FIXUP_PATH],
AC_MSG_ERROR([The path of $1, which resolves as "$path", is not found.]) AC_MSG_ERROR([The path of $1, which resolves as "$path", is not found.])
fi fi
$1="`cd "$path"; $THEPWDCMD`" $1="`cd "$path"; $THEPWDCMD -L`"
fi fi
]) ])
...@@ -169,10 +169,10 @@ AC_DEFUN([BASIC_REMOVE_SYMBOLIC_LINKS], ...@@ -169,10 +169,10 @@ AC_DEFUN([BASIC_REMOVE_SYMBOLIC_LINKS],
COUNTER=0 COUNTER=0
sym_link_dir=`$DIRNAME [$]$1` sym_link_dir=`$DIRNAME [$]$1`
sym_link_file=`$BASENAME [$]$1` sym_link_file=`$BASENAME [$]$1`
# Use the system pwd and not the shell builtin to resolve directory symlinks
cd $sym_link_dir cd $sym_link_dir
cd `$THEPWDCMD` # Use -P flag to resolve symlinks in directories.
sym_link_dir=`$THEPWDCMD` cd `$THEPWDCMD -P`
sym_link_dir=`$THEPWDCMD -P`
# Resolve file symlinks # Resolve file symlinks
while test $COUNTER -lt 20; do while test $COUNTER -lt 20; do
ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'` ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'`
...@@ -183,7 +183,7 @@ AC_DEFUN([BASIC_REMOVE_SYMBOLIC_LINKS], ...@@ -183,7 +183,7 @@ AC_DEFUN([BASIC_REMOVE_SYMBOLIC_LINKS],
# Again resolve directory symlinks since the target of the just found # Again resolve directory symlinks since the target of the just found
# link could be in a different directory # link could be in a different directory
cd `$DIRNAME $ISLINK` cd `$DIRNAME $ISLINK`
sym_link_dir=`$THEPWDCMD` sym_link_dir=`$THEPWDCMD -P`
sym_link_file=`$BASENAME $ISLINK` sym_link_file=`$BASENAME $ISLINK`
let COUNTER=COUNTER+1 let COUNTER=COUNTER+1
done done
...@@ -264,7 +264,6 @@ BASIC_REQUIRE_PROG(MKDIR, mkdir) ...@@ -264,7 +264,6 @@ BASIC_REQUIRE_PROG(MKDIR, mkdir)
BASIC_REQUIRE_PROG(MKTEMP, mktemp) BASIC_REQUIRE_PROG(MKTEMP, mktemp)
BASIC_REQUIRE_PROG(MV, mv) BASIC_REQUIRE_PROG(MV, mv)
BASIC_REQUIRE_PROG(PRINTF, printf) BASIC_REQUIRE_PROG(PRINTF, printf)
BASIC_REQUIRE_PROG(THEPWDCMD, pwd)
BASIC_REQUIRE_PROG(RM, rm) BASIC_REQUIRE_PROG(RM, rm)
BASIC_REQUIRE_PROG(SH, sh) BASIC_REQUIRE_PROG(SH, sh)
BASIC_REQUIRE_PROG(SORT, sort) BASIC_REQUIRE_PROG(SORT, sort)
...@@ -297,6 +296,10 @@ BASIC_CHECK_NONEMPTY(NAWK) ...@@ -297,6 +296,10 @@ BASIC_CHECK_NONEMPTY(NAWK)
# Always force rm. # Always force rm.
RM="$RM -f" RM="$RM -f"
# pwd behaves differently on various platforms and some don't support the -L flag.
# Always use the bash builtin pwd to get uniform behavior.
THEPWDCMD=pwd
# These are not required on all platforms # These are not required on all platforms
AC_PATH_PROG(CYGPATH, cygpath) AC_PATH_PROG(CYGPATH, cygpath)
AC_PATH_PROG(READLINK, readlink) AC_PATH_PROG(READLINK, readlink)
...@@ -309,13 +312,12 @@ AC_DEFUN_ONCE([BASIC_SETUP_PATHS], ...@@ -309,13 +312,12 @@ AC_DEFUN_ONCE([BASIC_SETUP_PATHS],
[ [
# Locate the directory of this script. # Locate the directory of this script.
SCRIPT="[$]0" SCRIPT="[$]0"
BASIC_REMOVE_SYMBOLIC_LINKS(SCRIPT) AUTOCONF_DIR=`cd \`$DIRNAME $SCRIPT\`; $THEPWDCMD -L`
AUTOCONF_DIR=`cd \`$DIRNAME $SCRIPT\`; $THEPWDCMD`
# Where is the source? It is located two levels above the configure script. # Where is the source? It is located two levels above the configure script.
CURDIR="$PWD" CURDIR="$PWD"
cd "$AUTOCONF_DIR/../.." cd "$AUTOCONF_DIR/../.."
SRC_ROOT="`$THEPWDCMD`" SRC_ROOT="`$THEPWDCMD -L`"
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
PATH_SEP=";" PATH_SEP=";"
...@@ -374,13 +376,9 @@ AC_ARG_WITH(conf-name, [AS_HELP_STRING([--with-conf-name], ...@@ -374,13 +376,9 @@ AC_ARG_WITH(conf-name, [AS_HELP_STRING([--with-conf-name],
[ CONF_NAME=${with_conf_name} ]) [ CONF_NAME=${with_conf_name} ])
# Test from where we are running configure, in or outside of src root. # Test from where we are running configure, in or outside of src root.
# To enable comparison of directories, CURDIR needs to be symlink free if test "x$CURDIR" = "x$SRC_ROOT" || test "x$CURDIR" = "x$SRC_ROOT/common" \
# just like SRC_ROOT already is || test "x$CURDIR" = "x$SRC_ROOT/common/autoconf" \
NOSYM_CURDIR="$CURDIR" || test "x$CURDIR" = "x$SRC_ROOT/common/makefiles" ; then
BASIC_REMOVE_SYMBOLIC_LINKS(NOSYM_CURDIR)
if test "x$NOSYM_CURDIR" = "x$SRC_ROOT" || test "x$NOSYM_CURDIR" = "x$SRC_ROOT/common" \
|| test "x$NOSYM_CURDIR" = "x$SRC_ROOT/common/autoconf" \
|| test "x$NOSYM_CURDIR" = "x$SRC_ROOT/common/makefiles" ; then
# We are running configure from the src root. # We are running configure from the src root.
# Create a default ./build/target-variant-debuglevel output root. # Create a default ./build/target-variant-debuglevel output root.
if test "x${CONF_NAME}" = x; then if test "x${CONF_NAME}" = x; then
...@@ -617,6 +615,20 @@ fi ...@@ -617,6 +615,20 @@ fi
if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then
BASIC_REQUIRE_PROG(XATTR, xattr) BASIC_REQUIRE_PROG(XATTR, xattr)
AC_PATH_PROG(CODESIGN, codesign)
if test "x$CODESIGN" != "x"; then
# Verify that the openjdk_codesign certificate is present
AC_MSG_CHECKING([if openjdk_codesign certificate is present])
rm -f codesign-testfile
touch codesign-testfile
codesign -s openjdk_codesign codesign-testfile 2>&AS_MESSAGE_LOG_FD >&AS_MESSAGE_LOG_FD || CODESIGN=
rm -f codesign-testfile
if test "x$CODESIGN" = x; then
AC_MSG_RESULT([no])
else
AC_MSG_RESULT([yes])
fi
fi
fi fi
]) ])
......
...@@ -300,7 +300,7 @@ AC_DEFUN([BASIC_FIXUP_EXECUTABLE_MSYS], ...@@ -300,7 +300,7 @@ AC_DEFUN([BASIC_FIXUP_EXECUTABLE_MSYS],
# Setup basic configuration paths, and platform-specific stuff related to PATHs. # Setup basic configuration paths, and platform-specific stuff related to PATHs.
AC_DEFUN([BASIC_CHECK_PATHS_WINDOWS], AC_DEFUN([BASIC_CHECK_PATHS_WINDOWS],
[ [
SRC_ROOT_LENGTH=`$THEPWDCMD|$WC -m` SRC_ROOT_LENGTH=`$THEPWDCMD -L|$WC -m`
if test $SRC_ROOT_LENGTH -gt 100; then if test $SRC_ROOT_LENGTH -gt 100; then
AC_MSG_ERROR([Your base path is too long. It is $SRC_ROOT_LENGTH characters long, but only 100 is supported]) AC_MSG_ERROR([Your base path is too long. It is $SRC_ROOT_LENGTH characters long, but only 100 is supported])
fi fi
......
...@@ -145,6 +145,9 @@ AC_DEFUN_ONCE([BPERF_SETUP_BUILD_JOBS], ...@@ -145,6 +145,9 @@ AC_DEFUN_ONCE([BPERF_SETUP_BUILD_JOBS],
if test "$JOBS" -gt "16"; then if test "$JOBS" -gt "16"; then
JOBS=16 JOBS=16
fi fi
if test "$JOBS" -eq "0"; then
JOBS=1
fi
AC_MSG_RESULT([$JOBS]) AC_MSG_RESULT([$JOBS])
else else
JOBS=$with_jobs JOBS=$with_jobs
......
...@@ -422,6 +422,14 @@ if test "x$MILESTONE" = x; then ...@@ -422,6 +422,14 @@ if test "x$MILESTONE" = x; then
MILESTONE=internal MILESTONE=internal
fi fi
AC_ARG_WITH(update-version, [AS_HELP_STRING([--with-update-version],
[Set update version value for build @<:@b00@:>@])])
if test "x$with_update_version" = xyes; then
AC_MSG_ERROR([Update version must have a value])
elif test "x$with_update_version" != x; then
JDK_UPDATE_VERSION="$with_update_version"
fi
AC_ARG_WITH(build-number, [AS_HELP_STRING([--with-build-number], AC_ARG_WITH(build-number, [AS_HELP_STRING([--with-build-number],
[Set build number value for build @<:@b00@:>@])]) [Set build number value for build @<:@b00@:>@])])
if test "x$with_build_number" = xyes; then if test "x$with_build_number" = xyes; then
......
...@@ -478,6 +478,7 @@ CCACHE:=@CCACHE@ ...@@ -478,6 +478,7 @@ CCACHE:=@CCACHE@
# CD is going away, but remains to cater for legacy makefiles. # CD is going away, but remains to cater for legacy makefiles.
CD:=cd CD:=cd
CHMOD:=@CHMOD@ CHMOD:=@CHMOD@
CODESIGN:=@CODESIGN@
COMM:=@COMM@ COMM:=@COMM@
CP:=@CP@ CP:=@CP@
CPIO:=@CPIO@ CPIO:=@CPIO@
......
...@@ -36,7 +36,7 @@ AC_DEFUN([TOOLCHAIN_CHECK_COMPILER_VERSION], ...@@ -36,7 +36,7 @@ AC_DEFUN([TOOLCHAIN_CHECK_COMPILER_VERSION],
$ECHO $COMPILER_VERSION_TEST | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null $ECHO $COMPILER_VERSION_TEST | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null
if test $? -ne 0; then if test $? -ne 0; then
GCC_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` GCC_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1`
AC_MSG_NOTICE([The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler.]) AC_MSG_NOTICE([The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler.])
AC_MSG_NOTICE([The result from running with -V was: "$COMPILER_VERSION_TEST" and with --version: "$GCC_VERSION_TEST"]) AC_MSG_NOTICE([The result from running with -V was: "$COMPILER_VERSION_TEST" and with --version: "$GCC_VERSION_TEST"])
AC_MSG_ERROR([Sun Studio compiler is required. Try setting --with-tools-dir.]) AC_MSG_ERROR([Sun Studio compiler is required. Try setting --with-tools-dir.])
...@@ -69,7 +69,7 @@ AC_DEFUN([TOOLCHAIN_CHECK_COMPILER_VERSION], ...@@ -69,7 +69,7 @@ AC_DEFUN([TOOLCHAIN_CHECK_COMPILER_VERSION],
AC_MSG_NOTICE([The result from running with --version was: "$COMPILER_VERSION_TEST"]) AC_MSG_NOTICE([The result from running with --version was: "$COMPILER_VERSION_TEST"])
AC_MSG_ERROR([GCC compiler is required. Try setting --with-tools-dir.]) AC_MSG_ERROR([GCC compiler is required. Try setting --with-tools-dir.])
fi fi
# First line typically looks something like: # First line typically looks something like:
# gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 # gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2
COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* \(@<:@1-9@:>@@<:@0-9.@:>@*\)/\1/p"` COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* \(@<:@1-9@:>@@<:@0-9.@:>@*\)/\1/p"`
...@@ -142,7 +142,7 @@ AC_DEFUN([TOOLCHAIN_FIND_COMPILER], ...@@ -142,7 +142,7 @@ AC_DEFUN([TOOLCHAIN_FIND_COMPILER],
BASIC_REMOVE_SYMBOLIC_LINKS(TEST_COMPILER) BASIC_REMOVE_SYMBOLIC_LINKS(TEST_COMPILER)
AC_MSG_RESULT([$TEST_COMPILER]) AC_MSG_RESULT([$TEST_COMPILER])
AC_MSG_CHECKING([if $1 is disguised ccache]) AC_MSG_CHECKING([if $1 is disguised ccache])
COMPILER_BASENAME=`$BASENAME "$TEST_COMPILER"` COMPILER_BASENAME=`$BASENAME "$TEST_COMPILER"`
if test "x$COMPILER_BASENAME" = "xccache"; then if test "x$COMPILER_BASENAME" = "xccache"; then
AC_MSG_RESULT([yes, trying to find proper $COMPILER_NAME compiler]) AC_MSG_RESULT([yes, trying to find proper $COMPILER_NAME compiler])
...@@ -226,11 +226,11 @@ BDEPS_CHECK_MODULE(DEVKIT, devkit, xxx, ...@@ -226,11 +226,11 @@ BDEPS_CHECK_MODULE(DEVKIT, devkit, xxx,
], ],
[]) [])
if test "x$SYS_ROOT" != "x/" ; then if test "x$SYS_ROOT" != "x/" ; then
CFLAGS="--sysroot=$SYS_ROOT $CFLAGS" CFLAGS="--sysroot=$SYS_ROOT $CFLAGS"
CXXFLAGS="--sysroot=$SYS_ROOT $CXXFLAGS" CXXFLAGS="--sysroot=$SYS_ROOT $CXXFLAGS"
OBJCFLAGS="--sysroot=$SYS_ROOT $OBJCFLAGS" OBJCFLAGS="--sysroot=$SYS_ROOT $OBJCFLAGS"
OBJCXXFLAGS="--sysroot=$SYS_ROOT $OBJCFLAGS" OBJCXXFLAGS="--sysroot=$SYS_ROOT $OBJCFLAGS"
CPPFLAGS="--sysroot=$SYS_ROOT $CPPFLAGS" CPPFLAGS="--sysroot=$SYS_ROOT $CPPFLAGS"
LDFLAGS="--sysroot=$SYS_ROOT $LDFLAGS" LDFLAGS="--sysroot=$SYS_ROOT $LDFLAGS"
fi fi
...@@ -330,7 +330,7 @@ AC_SUBST(HOTSPOT_LD) ...@@ -330,7 +330,7 @@ AC_SUBST(HOTSPOT_LD)
COMPILER_NAME=gcc COMPILER_NAME=gcc
COMPILER_TYPE=CC COMPILER_TYPE=CC
AS_IF([test "x$OPENJDK_TARGET_OS" = xwindows], [ AS_IF([test "x$OPENJDK_TARGET_OS" = xwindows], [
# For now, assume that we are always compiling using cl.exe. # For now, assume that we are always compiling using cl.exe.
CC_OUT_OPTION=-Fo CC_OUT_OPTION=-Fo
EXE_OUT_OPTION=-out: EXE_OUT_OPTION=-out:
LD_OUT_OPTION=-out: LD_OUT_OPTION=-out:
...@@ -491,7 +491,7 @@ AC_DEFUN_ONCE([TOOLCHAIN_SETUP_COMPILER_FLAGS_FOR_LIBS], ...@@ -491,7 +491,7 @@ AC_DEFUN_ONCE([TOOLCHAIN_SETUP_COMPILER_FLAGS_FOR_LIBS],
############################################################################### ###############################################################################
# #
# How to compile shared libraries. # How to compile shared libraries.
# #
if test "x$GCC" = xyes; then if test "x$GCC" = xyes; then
...@@ -525,7 +525,7 @@ if test "x$GCC" = xyes; then ...@@ -525,7 +525,7 @@ if test "x$GCC" = xyes; then
SHARED_LIBRARY_FLAGS="-dynamiclib -compatibility_version 1.0.0 -current_version 1.0.0 $PICFLAG" SHARED_LIBRARY_FLAGS="-dynamiclib -compatibility_version 1.0.0 -current_version 1.0.0 $PICFLAG"
SHARED_LIBRARY_SUFFIX='.dylib' SHARED_LIBRARY_SUFFIX='.dylib'
EXE_SUFFIX='' EXE_SUFFIX=''
SET_SHARED_LIBRARY_NAME='-Xlinker -install_name -Xlinker @rpath/[$]1' SET_SHARED_LIBRARY_NAME='-Xlinker -install_name -Xlinker @rpath/[$]1'
SET_SHARED_LIBRARY_MAPFILE='' SET_SHARED_LIBRARY_MAPFILE=''
SET_SHARED_LIBRARY_ORIGIN='-Xlinker -rpath -Xlinker @loader_path/.' SET_SHARED_LIBRARY_ORIGIN='-Xlinker -rpath -Xlinker @loader_path/.'
SET_EXECUTABLE_ORIGIN="$SET_SHARED_LIBRARY_ORIGIN" SET_EXECUTABLE_ORIGIN="$SET_SHARED_LIBRARY_ORIGIN"
...@@ -676,7 +676,7 @@ case $COMPILER_TYPE in ...@@ -676,7 +676,7 @@ case $COMPILER_TYPE in
# Use single precision floating point with 'float' # Use single precision floating point with 'float'
CC_HIGHEST="$CC_HIGHEST -fsingle" CC_HIGHEST="$CC_HIGHEST -fsingle"
# Assume memory references via basic pointer types do not alias # Assume memory references via basic pointer types do not alias
# (Source with excessing pointer casting and data access with mixed # (Source with excessing pointer casting and data access with mixed
# pointer types are not recommended) # pointer types are not recommended)
CC_HIGHEST="$CC_HIGHEST -xalias_level=basic" CC_HIGHEST="$CC_HIGHEST -xalias_level=basic"
# Use intrinsic or inline versions for math/std functions # Use intrinsic or inline versions for math/std functions
...@@ -892,7 +892,7 @@ if test "x$OPENJDK_TARGET_OS" = xsolaris; then ...@@ -892,7 +892,7 @@ if test "x$OPENJDK_TARGET_OS" = xsolaris; then
fi fi
if test "x$OPENJDK_TARGET_OS" = xmacosx; then if test "x$OPENJDK_TARGET_OS" = xmacosx; then
CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMACOSX -D_ALLBSD_SOURCE" CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DMACOSX -D_ALLBSD_SOURCE"
# Setting these parameters makes it an error to link to macosx APIs that are # Setting these parameters makes it an error to link to macosx APIs that are
# newer than the given OS version and makes the linked binaries compatible even # newer than the given OS version and makes the linked binaries compatible even
# if built on a newer version of the OS. # if built on a newer version of the OS.
# The expected format is X.Y.Z # The expected format is X.Y.Z
...@@ -940,12 +940,12 @@ CXXFLAGS_JDKEXE="$CCXXFLAGS_JDK $CXXFLAGS_JDK" ...@@ -940,12 +940,12 @@ CXXFLAGS_JDKEXE="$CCXXFLAGS_JDK $CXXFLAGS_JDK"
# Which should we link to? Are we lucky enough that the binary api to the libjvm.so library # Which should we link to? Are we lucky enough that the binary api to the libjvm.so library
# is identical for client and server? Yes. Which is picked at runtime (client or server)? # is identical for client and server? Yes. Which is picked at runtime (client or server)?
# Neither, since the chosen libjvm.so has already been loaded by the launcher, all the following # Neither, since the chosen libjvm.so has already been loaded by the launcher, all the following
# libraries will link to whatever is in memory. Yuck. # libraries will link to whatever is in memory. Yuck.
# #
# Thus we offer the compiler to find libjvm.so first in server then in client. It works. Ugh. # Thus we offer the compiler to find libjvm.so first in server then in client. It works. Ugh.
if test "x$COMPILER_NAME" = xcl; then if test "x$COMPILER_NAME" = xcl; then
LDFLAGS_JDK="$LDFLAGS_JDK -nologo -opt:ref -incremental:no" LDFLAGS_JDK="$LDFLAGS_JDK -nologo -opt:ref -incremental:no"
if test "x$OPENJDK_TARGET_CPU" = xx86; then if test "x$OPENJDK_TARGET_CPU" = xx86; then
LDFLAGS_JDK="$LDFLAGS_JDK -safeseh" LDFLAGS_JDK="$LDFLAGS_JDK -safeseh"
fi fi
# TODO: make -debug optional "--disable-full-debug-symbols" # TODO: make -debug optional "--disable-full-debug-symbols"
...@@ -965,7 +965,7 @@ else ...@@ -965,7 +965,7 @@ else
if test -n "$HAS_GNU_HASH"; then if test -n "$HAS_GNU_HASH"; then
LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both " LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both "
fi fi
if test "x$OPENJDK_TARGET_OS" = xlinux; then if test "x$OPENJDK_TARGET_OS" = xlinux; then
# And since we now know that the linker is gnu, then add -z defs, to forbid # And since we now know that the linker is gnu, then add -z defs, to forbid
# undefined symbols in object files. # undefined symbols in object files.
LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs" LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs"
...@@ -1006,7 +1006,7 @@ fi ...@@ -1006,7 +1006,7 @@ fi
# Adjust flags according to debug level. # Adjust flags according to debug level.
case $DEBUG_LEVEL in case $DEBUG_LEVEL in
fastdebug ) fastdebug )
CFLAGS="$CFLAGS $D_FLAG" CFLAGS="$CFLAGS $D_FLAG"
JAVAC_FLAGS="$JAVAC_FLAGS -g" JAVAC_FLAGS="$JAVAC_FLAGS -g"
;; ;;
...@@ -1018,9 +1018,9 @@ case $DEBUG_LEVEL in ...@@ -1018,9 +1018,9 @@ case $DEBUG_LEVEL in
CXX_O_FLAG_NORM="$CXX_O_FLAG_NONE" CXX_O_FLAG_NORM="$CXX_O_FLAG_NONE"
JAVAC_FLAGS="$JAVAC_FLAGS -g" JAVAC_FLAGS="$JAVAC_FLAGS -g"
;; ;;
esac esac
AC_SUBST(CFLAGS_JDKLIB) AC_SUBST(CFLAGS_JDKLIB)
AC_SUBST(CFLAGS_JDKEXE) AC_SUBST(CFLAGS_JDKEXE)
...@@ -1092,28 +1092,45 @@ AC_DEFUN_ONCE([TOOLCHAIN_SETUP_COMPILER_FLAGS_MISC], ...@@ -1092,28 +1092,45 @@ AC_DEFUN_ONCE([TOOLCHAIN_SETUP_COMPILER_FLAGS_MISC],
AC_SUBST(COMPILER_SUPPORTS_TARGET_BITS_FLAG) AC_SUBST(COMPILER_SUPPORTS_TARGET_BITS_FLAG)
]) ])
# Setup the JTREG paths # Setup the JTREG paths
AC_DEFUN_ONCE([TOOLCHAIN_SETUP_JTREG], AC_DEFUN_ONCE([TOOLCHAIN_SETUP_JTREG],
[ [
AC_ARG_WITH(jtreg, [AS_HELP_STRING([--with-jtreg], AC_ARG_WITH(jtreg, [AS_HELP_STRING([--with-jtreg],
[Regression Test Harness @<:@probed@:>@])]) [Regression Test Harness @<:@probed@:>@])],
[],
AC_MSG_CHECKING([for JTReg Regression Test Harness]) [with_jtreg=no])
if test "x$with_jtreg" != x; then if test "x$with_jtreg" = xno; then
JT_HOME="$with_jtreg" # jtreg disabled
BASIC_FIXUP_PATH([JT_HOME]) AC_MSG_CHECKING([for jtreg])
AC_MSG_RESULT($JT_HOME)
# jtreg win32 script works for everybody
JTREGEXE="$JT_HOME/win32/bin/jtreg"
if test ! -f "$JTREGEXE"; then
AC_MSG_ERROR([JTReg executable does not exist: $JTREGEXE])
fi
else
AC_MSG_RESULT(no) AC_MSG_RESULT(no)
fi else
if test "x$with_jtreg" != xyes; then
AC_SUBST(JT_HOME) # with path specified.
AC_SUBST(JTREGEXE) JT_HOME="$with_jtreg"
fi
if test "x$JT_HOME" != x; then
AC_MSG_CHECKING([for jtreg])
# use JT_HOME enviroment var.
BASIC_FIXUP_PATH([JT_HOME])
# jtreg win32 script works for everybody
JTREGEXE="$JT_HOME/win32/bin/jtreg"
if test ! -f "$JTREGEXE"; then
AC_MSG_ERROR([JTReg executable does not exist: $JTREGEXE])
fi
AC_MSG_RESULT($JTREGEXE)
else
# try to find jtreg on path
BASIC_REQUIRE_PROG(JTREGEXE, jtreg)
JT_HOME="`$DIRNAME $JTREGEXE`"
fi
fi
AC_SUBST(JT_HOME)
AC_SUBST(JTREGEXE)
]) ])
...@@ -127,9 +127,21 @@ else ...@@ -127,9 +127,21 @@ else
ifdef ALT_JAVAFX_ZIP_DIR ifdef ALT_JAVAFX_ZIP_DIR
@$(ECHO) " --with-javafx-zip-dir=$(call UnixPath,$(ALT_JAVAFX_ZIP_DIR)) " >> $@.tmp @$(ECHO) " --with-javafx-zip-dir=$(call UnixPath,$(ALT_JAVAFX_ZIP_DIR)) " >> $@.tmp
endif endif
ifdef ALT_JMC_ZIP_DIR
@$(ECHO) " --with-jmc-zip-dir=$(call UnixPath,$(ALT_JMC_ZIP_DIR)) " >> $@.tmp
endif
ifdef ALT_WIXDIR ifdef ALT_WIXDIR
@$(ECHO) " --with-wix=$(call UnixPath,$(ALT_WIXDIR)) " >> $@.tmp @$(ECHO) " --with-wix=$(call UnixPath,$(ALT_WIXDIR)) " >> $@.tmp
endif endif
ifdef ALT_INSTALL_LZMA_PATH
@$(ECHO) " --with-lzma-path=$(call UnixPath,$(ALT_INSTALL_LZMA_PATH)) " >> $@.tmp
endif
ifdef ALT_INSTALL_UPX_PATH
@$(ECHO) " --with-upx-path=$(call UnixPath,$(ALT_INSTALL_UPX_PATH)) " >> $@.tmp
endif
ifdef ALT_INSTALL_UPX_FILENAME
@$(ECHO) " --with-upx-filename=$(call UnixPath,$(ALT_INSTALL_UPX_FILENAME)) " >> $@.tmp
endif
ifdef ALT_CCSS_SIGNING_DIR ifdef ALT_CCSS_SIGNING_DIR
@$(ECHO) " --with-ccss-signing=$(call UnixPath,$(ALT_CCSS_SIGNING_DIR)) " >> $@.tmp @$(ECHO) " --with-ccss-signing=$(call UnixPath,$(ALT_CCSS_SIGNING_DIR)) " >> $@.tmp
endif endif
......
...@@ -183,7 +183,7 @@ bootcycle-images-only: start-make ...@@ -183,7 +183,7 @@ bootcycle-images-only: start-make
test: images test-only test: images test-only
test-only: start-make test-only: start-make
@$(call TargetEnter) @$(call TargetEnter)
@($(CD) $(SRC_ROOT)/test && $(BUILD_LOG_WRAPPER) $(MAKE) -j1 -k MAKEFLAGS= PRODUCT_HOME=$(JDK_IMAGE_DIR) JPRT_JAVA_HOME=$(JDK_IMAGE_DIR) ALT_OUTPUTDIR=$(OUTPUT_ROOT) $(TEST)) || true @($(CD) $(SRC_ROOT)/test && $(BUILD_LOG_WRAPPER) $(MAKE) -j1 -k JT_HOME=$(JT_HOME) MAKEFLAGS= PRODUCT_HOME=$(JDK_IMAGE_DIR) JPRT_JAVA_HOME=$(JDK_IMAGE_DIR) ALT_OUTPUTDIR=$(OUTPUT_ROOT) $(TEST)) || true
@$(call TargetExit) @$(call TargetExit)
# Stores the tips for each repository. This file is be used when constructing the jdk image and can be # Stores the tips for each repository. This file is be used when constructing the jdk image and can be
......
...@@ -361,8 +361,8 @@ $(eval $(call SetupLogging)) ...@@ -361,8 +361,8 @@ $(eval $(call SetupLogging))
# This is to be called by all SetupFoo macros # This is to be called by all SetupFoo macros
define LogSetupMacroEntry define LogSetupMacroEntry
$(if $(26),$(error Internal makefile error: Too many arguments to LogSetupMacroEntry, please update MakeBase.gmk)) $(if $(27),$(error Internal makefile error: Too many arguments to LogSetupMacroEntry, please update MakeBase.gmk))
$(if $(findstring $(LOG_LEVEL),debug trace), $(info $1 $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25,$(if $($i),$(NEWLINE) $(strip [$i] $($i)))))) $(if $(findstring $(LOG_LEVEL),debug trace), $(info $1 $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26,$(if $($i),$(NEWLINE) $(strip [$i] $($i))))))
endef endef
# Make directory without forking mkdir if not needed # Make directory without forking mkdir if not needed
......
...@@ -147,9 +147,9 @@ define SetupNativeCompilation ...@@ -147,9 +147,9 @@ define SetupNativeCompilation
# CC the compiler to use, default is $(CC) # CC the compiler to use, default is $(CC)
# LDEXE the linker to use for linking executables, default is $(LDEXE) # LDEXE the linker to use for linking executables, default is $(LDEXE)
# OPTIMIZATION sets optimization level to NONE, LOW, HIGH, HIGHEST # OPTIMIZATION sets optimization level to NONE, LOW, HIGH, HIGHEST
$(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26, $(if $($i),$1_$(strip $($i)))$(NEWLINE))
$(call LogSetupMacroEntry,SetupNativeCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15),$(16),$(17),$(18),$(19),$(20),$(21),$(22),$(23),$(24),$(25)) $(call LogSetupMacroEntry,SetupNativeCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15),$(16),$(17),$(18),$(19),$(20),$(21),$(22),$(23),$(24),$(25),$(26))
$(if $(26),$(error Internal makefile error: Too many arguments to SetupNativeCompilation, please update NativeCompilation.gmk)) $(if $(27),$(error Internal makefile error: Too many arguments to SetupNativeCompilation, please update NativeCompilation.gmk))
ifneq (,$$($1_BIN)) ifneq (,$$($1_BIN))
$$(error BIN has been replaced with OBJECT_DIR) $$(error BIN has been replaced with OBJECT_DIR)
...@@ -567,6 +567,12 @@ define SetupNativeCompilation ...@@ -567,6 +567,12 @@ define SetupNativeCompilation
ifneq (,$$($1_GEN_MANIFEST)) ifneq (,$$($1_GEN_MANIFEST))
$(MT) -nologo -manifest $$($1_GEN_MANIFEST) -outputresource:$$@;#1 $(MT) -nologo -manifest $$($1_GEN_MANIFEST) -outputresource:$$@;#1
endif endif
# This only works if the openjdk_codesign identity is present on the system. Let
# silently fail otherwise.
ifneq (,$(CODESIGN))
ifneq (,$$($1_CODESIGN))
$(CODESIGN) -s openjdk_codesign $$@
endif
endif
endif endif
endef endef
...@@ -345,3 +345,4 @@ c4af77d2045476c56fbf3f914b336bb1b7cd18af hs25-b30 ...@@ -345,3 +345,4 @@ c4af77d2045476c56fbf3f914b336bb1b7cd18af hs25-b30
b19517cecc2e91636d7c16ba2f35e3d3dc628099 hs25-b33 b19517cecc2e91636d7c16ba2f35e3d3dc628099 hs25-b33
7cbdf0e3725c0c56a2ff7540fc70b6d4b5890d04 jdk8-b91 7cbdf0e3725c0c56a2ff7540fc70b6d4b5890d04 jdk8-b91
38da9f4f67096745f851318d792d6468aa1f6cf8 hs25-b34 38da9f4f67096745f851318d792d6468aa1f6cf8 hs25-b34
092018493d3bbeb1c24278fd8c40ff3d76e1fed7 jdk8-b92
...@@ -213,3 +213,4 @@ d5228e624826a10ccc5b05f30ad8d839b58fe48d jdk8-b87 ...@@ -213,3 +213,4 @@ d5228e624826a10ccc5b05f30ad8d839b58fe48d jdk8-b87
845025546e35519fbb8970e79fc2a834063a5e19 jdk8-b89 845025546e35519fbb8970e79fc2a834063a5e19 jdk8-b89
c63eda8f63008a4398d2c22ac8d72f7fef6f9238 jdk8-b90 c63eda8f63008a4398d2c22ac8d72f7fef6f9238 jdk8-b90
169451cf0cc53bde5af24f9820ea3f35ec4b4df4 jdk8-b91 169451cf0cc53bde5af24f9820ea3f35ec4b4df4 jdk8-b91
a2a2a91075ad85becbe10a39d7fd04ef9bea8df5 jdk8-b92
# #
# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
...@@ -432,40 +432,3 @@ RC_FLAGS += -d "JDK_BUILD_ID=$(JDK_RC_BUILD_ID)" \ ...@@ -432,40 +432,3 @@ RC_FLAGS += -d "JDK_BUILD_ID=$(JDK_RC_BUILD_ID)" \
-d "JDK_COPYRIGHT=$(JDK_RC_COPYRIGHT)" \ -d "JDK_COPYRIGHT=$(JDK_RC_COPYRIGHT)" \
-d "JDK_NAME=$(JDK_RC_NAME)" \ -d "JDK_NAME=$(JDK_RC_NAME)" \
-d "JDK_FVER=$(JDK_RC_FVER)" -d "JDK_FVER=$(JDK_RC_FVER)"
# Enable 7-Zip LZMA file (de)compression for Java Kernel if it is available
ifeq ($(ARCH_DATA_MODEL), 32)
ifneq ($(KERNEL), off)
# This is a hack to use until 7-Zip (and UPX) bundles can be put
# under /java/devtools.
ifndef DEPLOY_TOPDIR
DEPLOY_TOPDIR=$(JDK_TOPDIR)/../deploy
endif
# Uncomment this block to cause build failure if above assumption false
#DCHK = $(shell if [ ! -d $(DEPLOY_TOPDIR) ] ; then \
# $(ECHO) deploy_not_a_peer_of_j2se ; \
#fi )
#ifeq ($(DCHK), deploy_not_a_peer_of_j2se)
# If a build failure points to control coming here it means
# it means deploy is not in the same directory
# as j2se. Java Kernel can't tolerate that for the time being.
#endif
EC_TMP = $(shell if [ -d $(DEPLOY_TOPDIR)/make/lzma ] ; then \
$(ECHO) true ; \
else \
$(ECHO) false ; \
fi )
ifeq ($(EC_TMP), true)
EXTRA_COMP_INSTALL_PATH = lib\\\\deploy\\\\lzma.dll
# Crazy but true: deploy/make/plugin/jinstall/Makefile.jkernel does
# not include deploy/make/common/Defs-windows.gmk, either directly
# or indirectly. But it does include this file, so redundantly declare
# these variables that are in deploy/make/common/Defs-windows.gmk for
# the sake of the Java Kernel part of the deploy build. Whew!
EXTRA_COMP_LIB_NAME = lzma.dll
EXTRA_COMP_PATH = $(OUTPUTDIR)/tmp/deploy/lzma/win32/obj
EXTRA_COMP_CMD_PATH = $(EXTRA_COMP_PATH)/lzma.exe
EXTRA_COMP_LIB_PATH = $(EXTRA_COMP_PATH)/$(EXTRA_COMP_LIB_NAME)
endif
endif
endif
...@@ -31,6 +31,8 @@ BUILDDIR = ../.. ...@@ -31,6 +31,8 @@ BUILDDIR = ../..
LIBRARY = jdwp LIBRARY = jdwp
PRODUCT = jpda PRODUCT = jpda
LIBRARY_SUPPORTS_FULL_DEBUG_SYMBOLS=1
FILES_m = mapfile-vers FILES_m = mapfile-vers
include $(BUILDDIR)/common/Defs.gmk include $(BUILDDIR)/common/Defs.gmk
......
...@@ -171,3 +171,13 @@ FILES_NO_MOTIF_c = \ ...@@ -171,3 +171,13 @@ FILES_NO_MOTIF_c = \
GLXSurfaceData.c \ GLXSurfaceData.c \
AccelGlyphCache.c \ AccelGlyphCache.c \
CUPSfuncs.c CUPSfuncs.c
ifeq ($(PLATFORM), macosx)
FILES_NO_MOTIF_objc = \
AWTFont.m \
AWTStrike.m \
CCharToGlyphMapper.m \
CGGlyphImages.m \
CGGlyphOutlines.m \
CoreTextSupport.m
endif # PLATFORM
...@@ -187,3 +187,14 @@ FILES_export2 = \ ...@@ -187,3 +187,14 @@ FILES_export2 = \
java/awt/dnd/DnDConstants.java \ java/awt/dnd/DnDConstants.java \
sun/awt/CausedFocusEvent.java sun/awt/CausedFocusEvent.java
ifeq ($(PLATFORM), macosx)
ifeq ($(HEADLESS), true)
FILES_export += \
sun/awt/SunHints.java \
sun/font/CCharToGlyphMapper.java \
sun/font/CFont.java \
sun/font/CFontManager.java \
sun/font/CStrike.java \
sun/font/CStrikeDisposer.java
endif # HEADLESS
endif # PLATFORM
...@@ -43,6 +43,10 @@ include $(BUILDDIR)/sun/awt/FILES_export_unix.gmk ...@@ -43,6 +43,10 @@ include $(BUILDDIR)/sun/awt/FILES_export_unix.gmk
# compiled based on the motif version. # compiled based on the motif version.
FILES_c = $(FILES_NO_MOTIF_c) FILES_c = $(FILES_NO_MOTIF_c)
ifeq ($(PLATFORM), macosx)
FILES_objc = $(FILES_NO_MOTIF_objc)
endif # PLATFORM
ifeq ($(PLATFORM), solaris) ifeq ($(PLATFORM), solaris)
ifneq ($(ARCH), amd64) ifneq ($(ARCH), amd64)
FILES_reorder += reorder-$(ARCH) FILES_reorder += reorder-$(ARCH)
...@@ -97,6 +101,10 @@ vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d/pipe ...@@ -97,6 +101,10 @@ vpath %.c $(SHARE_SRC)/native/$(PKGDIR)/../java2d/pipe
vpath %.cpp $(SHARE_SRC)/native/$(PKGDIR)/image vpath %.cpp $(SHARE_SRC)/native/$(PKGDIR)/image
vpath %.c $(PLATFORM_SRC)/native/$(PKGDIR)/robot_child vpath %.c $(PLATFORM_SRC)/native/$(PKGDIR)/robot_child
ifeq ($(PLATFORM), macosx)
vpath %.m $(call NativeSrcDirList,,native/sun/font)
endif # PLATFORM
# #
# Libraries to link in. # Libraries to link in.
# #
...@@ -192,13 +200,21 @@ CPPFLAGS += -I$(SHARE_SRC)/native/$(PKGDIR)/debug \ ...@@ -192,13 +200,21 @@ CPPFLAGS += -I$(SHARE_SRC)/native/$(PKGDIR)/debug \
$(EVENT_MODEL) $(EVENT_MODEL)
ifeq ($(PLATFORM), macosx) ifeq ($(PLATFORM), macosx)
CPPFLAGS += -I$(CUPS_HEADERS_PATH) CPPFLAGS += -I$(CUPS_HEADERS_PATH) \
$(call NativeSrcDirList,-I,native/sun/awt) \
$(call NativeSrcDirList,-I,native/sun/font)
ifndef HEADLESS ifndef HEADLESS
CPPFLAGS += -I$(MOTIF_DIR)/include \ CPPFLAGS += -I$(MOTIF_DIR)/include \
-I$(OPENWIN_HOME)/include -I$(OPENWIN_HOME)/include
LDFLAGS += -L$(MOTIF_LIB) -L$(OPENWIN_LIB) LDFLAGS += -L$(MOTIF_LIB) -L$(OPENWIN_LIB)
else
LDFLAGS += -framework Accelerate \
-framework ApplicationServices \
-framework Cocoa \
-F/System/Library/Frameworks/JavaVM.framework/Frameworks \
-framework JavaNativeFoundation \
-framework JavaRuntimeSupport
endif # !HEADLESS endif # !HEADLESS
endif # PLATFORM endif # PLATFORM
......
...@@ -95,6 +95,9 @@ define SetupLauncher ...@@ -95,6 +95,9 @@ define SetupLauncher
$1_PLIST_FILE:=Info-cmdline.plist $1_PLIST_FILE:=Info-cmdline.plist
ifneq ($(11),) ifneq ($(11),)
$1_PLIST_FILE:=$(11) $1_PLIST_FILE:=$(11)
ifneq ($$(findstring privileged,$$($1_PLIST_FILE)),)
$1_CODESIGN:=true
endif
endif endif
$1_LDFLAGS += -Wl,-all_load $(JDK_OUTPUTDIR)/objs/libjli_static.a \ $1_LDFLAGS += -Wl,-all_load $(JDK_OUTPUTDIR)/objs/libjli_static.a \
...@@ -174,7 +177,8 @@ define SetupLauncher ...@@ -174,7 +177,8 @@ define SetupLauncher
-D "JDK_INTERNAL_NAME=$1" \ -D "JDK_INTERNAL_NAME=$1" \
-D "JDK_FTYPE=0x1L" \ -D "JDK_FTYPE=0x1L" \
$7,\ $7,\
MANIFEST:=$(JDK_TOPDIR)/src/windows/resource/java.manifest) MANIFEST:=$(JDK_TOPDIR)/src/windows/resource/java.manifest,\
CODESIGN:=$$($1_CODESIGN))
BUILD_LAUNCHERS += $$(BUILD_LAUNCHER_$1) BUILD_LAUNCHERS += $$(BUILD_LAUNCHER_$1)
......
...@@ -1143,7 +1143,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJDWP,\ ...@@ -1143,7 +1143,7 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBJDWP,\
-D "JDK_INTERNAL_NAME=jdwp" \ -D "JDK_INTERNAL_NAME=jdwp" \
-D "JDK_FTYPE=0x2L",\ -D "JDK_FTYPE=0x2L",\
OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjdwp,\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libjdwp,\
DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) DEBUG_SYMBOLS:=true))
$(BUILD_LIBJDWP) : $(BUILD_LIBJAVA) $(BUILD_LIBJDWP) : $(BUILD_LIBJAVA)
...@@ -2314,6 +2314,10 @@ LIBAWT_HEADLESS_DIRS:=$(JDK_TOPDIR)/src/share/native/sun/font \ ...@@ -2314,6 +2314,10 @@ LIBAWT_HEADLESS_DIRS:=$(JDK_TOPDIR)/src/share/native/sun/font \
$(JDK_TOPDIR)/src/solaris/native/sun/java2d/opengl \ $(JDK_TOPDIR)/src/solaris/native/sun/java2d/opengl \
$(JDK_TOPDIR)/src/solaris/native/sun/java2d/x11 $(JDK_TOPDIR)/src/solaris/native/sun/java2d/x11
ifeq ($(OPENJDK_TARGET_OS),macosx)
LIBAWT_HEADLESS_DIRS+=$(JDK_TOPDIR)/src/macosx/native/sun/font
endif
LIBAWT_HEADLESS_CFLAGS:=-DHEADLESS=true \ LIBAWT_HEADLESS_CFLAGS:=-DHEADLESS=true \
-DX11_PATH=\"$(X11_PATH)\" -DPACKAGE_PATH=\"$(PACKAGE_PATH)\" \ -DX11_PATH=\"$(X11_PATH)\" -DPACKAGE_PATH=\"$(PACKAGE_PATH)\" \
$(CUPS_CFLAGS) \ $(CUPS_CFLAGS) \
...@@ -2328,6 +2332,12 @@ LIBAWT_HEADLESS_CFLAGS:=-DHEADLESS=true \ ...@@ -2328,6 +2332,12 @@ LIBAWT_HEADLESS_CFLAGS:=-DHEADLESS=true \
-I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/jdga \ -I$(JDK_TOPDIR)/src/$(OPENJDK_TARGET_OS_API_DIR)/native/sun/jdga \
$(foreach dir,$(LIBAWT_HEADLESS_DIRS),-I$(dir)) $(foreach dir,$(LIBAWT_HEADLESS_DIRS),-I$(dir))
ifeq ($(OPENJDK_TARGET_OS),macosx)
LIBAWT_HEADLESS_CFLAGS+=\
-F/System/Library/Frameworks/JavaVM.framework/Frameworks \
-F/System/Library/Frameworks/ApplicationServices.framework/Frameworks
endif
LIBAWT_HEADLESS_FILES:=\ LIBAWT_HEADLESS_FILES:=\
awt_Font.c \ awt_Font.c \
HeadlessToolkit.c \ HeadlessToolkit.c \
...@@ -2356,6 +2366,16 @@ LIBAWT_HEADLESS_FILES:=\ ...@@ -2356,6 +2366,16 @@ LIBAWT_HEADLESS_FILES:=\
AccelGlyphCache.c \ AccelGlyphCache.c \
CUPSfuncs.c CUPSfuncs.c
ifeq ($(OPENJDK_TARGET_OS),macosx)
LIBAWT_HEADLESS_FILES+=\
AWTFont.m \
AWTStrike.m \
CCharToGlyphMapper.m \
CGGlyphImages.m \
CGGlyphOutlines.m \
CoreTextSupport.m
endif
LIBAWT_HEADLESS_REORDER:= LIBAWT_HEADLESS_REORDER:=
ifeq ($(OPENJDK_TARGET_OS), solaris) ifeq ($(OPENJDK_TARGET_OS), solaris)
ifneq ($(OPENJDK_TARGET_CPU), x86_64) ifneq ($(OPENJDK_TARGET_CPU), x86_64)
...@@ -2382,7 +2402,13 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBAWT_HEADLESS,\ ...@@ -2382,7 +2402,13 @@ $(eval $(call SetupNativeCompilation,BUILD_LIBAWT_HEADLESS,\
REORDER:=$(LIBAWT_HEADLESS_REORDER), \ REORDER:=$(LIBAWT_HEADLESS_REORDER), \
LDFLAGS_SUFFIX_linux:=-ljvm -lawt -lm $(LIBDL) -ljava,\ LDFLAGS_SUFFIX_linux:=-ljvm -lawt -lm $(LIBDL) -ljava,\
LDFLAGS_SUFFIX_solaris:=$(LIBDL) -ljvm -lawt -lm -ljava $(LIBCXX) -lc,\ LDFLAGS_SUFFIX_solaris:=$(LIBDL) -ljvm -lawt -lm -ljava $(LIBCXX) -lc,\
LDFLAGS_SUFFIX_macosx:=-ljvm $(LIBCXX) -lawt $(LIBDL) -ljava,\ LDFLAGS_SUFFIX_macosx:=-ljvm $(LIBCXX) -lawt $(LIBDL) -ljava \
-framework Accelerate \
-framework ApplicationServices \
-framework Cocoa \
-F/System/Library/Frameworks/JavaVM.framework/Frameworks \
-framework JavaNativeFoundation \
-framework JavaRuntimeSupport,\
OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libawt_headless,\ OBJECT_DIR:=$(JDK_OUTPUTDIR)/objs/libawt_headless,\
DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES))) DEBUG_SYMBOLS:=$(DEBUG_ALL_BINARIES)))
......
...@@ -50,8 +50,6 @@ images:: jre-image jdk-image ...@@ -50,8 +50,6 @@ images:: jre-image jdk-image
overlay-images: jre-overlay-image jdk-overlay-image overlay-images: jre-overlay-image jdk-overlay-image
-include $(CUSTOM_MAKE_DIR)/Images.gmk
# Processing license files from source area to image area # Processing license files from source area to image area
# These will be modified to have the platform specific EOL chars. # These will be modified to have the platform specific EOL chars.
...@@ -774,3 +772,5 @@ endif # Profile ...@@ -774,3 +772,5 @@ endif # Profile
################################################################################ ################################################################################
.PHONY: default images jre-image jdk-image .PHONY: default images jre-image jdk-image
-include $(CUSTOM_MAKE_DIR)/Images.gmk
...@@ -44,7 +44,6 @@ ...@@ -44,7 +44,6 @@
#include <Cocoa/Cocoa.h> #include <Cocoa/Cocoa.h>
#include <objc/objc-runtime.h> #include <objc/objc-runtime.h>
#include <objc/objc-auto.h> #include <objc/objc-auto.h>
#include <dispatch/dispatch.h>
#include <errno.h> #include <errno.h>
#include <spawn.h> #include <spawn.h>
...@@ -1001,6 +1000,32 @@ SetXStartOnFirstThreadArg() ...@@ -1001,6 +1000,32 @@ SetXStartOnFirstThreadArg()
setenv(envVar, "1", 1); setenv(envVar, "1", 1);
} }
/* This class is made for performSelectorOnMainThread when java main
* should be launched on main thread.
* We cannot use dispatch_sync here, because it blocks the main dispatch queue
* which is used inside Cocoa
*/
@interface JavaLaunchHelper : NSObject {
int _returnValue;
}
- (void) launchJava:(NSValue*)argsValue;
- (int) getReturnValue;
@end
@implementation JavaLaunchHelper
- (void) launchJava:(NSValue*)argsValue
{
_returnValue = JavaMain([argsValue pointerValue]);
}
- (int) getReturnValue
{
return _returnValue;
}
@end
// MacOSX we may continue in the same thread // MacOSX we may continue in the same thread
int int
JVMInit(InvocationFunctions* ifn, jlong threadStackSize, JVMInit(InvocationFunctions* ifn, jlong threadStackSize,
...@@ -1010,16 +1035,22 @@ JVMInit(InvocationFunctions* ifn, jlong threadStackSize, ...@@ -1010,16 +1035,22 @@ JVMInit(InvocationFunctions* ifn, jlong threadStackSize,
JLI_TraceLauncher("In same thread\n"); JLI_TraceLauncher("In same thread\n");
// need to block this thread against the main thread // need to block this thread against the main thread
// so signals get caught correctly // so signals get caught correctly
__block int rslt; JavaMainArgs args;
dispatch_sync(dispatch_get_main_queue(), ^(void) { args.argc = argc;
JavaMainArgs args; args.argv = argv;
args.argc = argc; args.mode = mode;
args.argv = argv; args.what = what;
args.mode = mode; args.ifn = *ifn;
args.what = what; int rslt;
args.ifn = *ifn; NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
rslt = JavaMain((void*)&args); {
}); JavaLaunchHelper* launcher = [[[JavaLaunchHelper alloc] init] autorelease];
[launcher performSelectorOnMainThread:@selector(launchJava:)
withObject:[NSValue valueWithPointer:(void*)&args]
waitUntilDone:YES];
rslt = [launcher getReturnValue];
}
[pool drain];
return rslt; return rslt;
} else { } else {
return ContinueInNewThread(ifn, threadStackSize, argc, argv, mode, what, ret); return ContinueInNewThread(ifn, threadStackSize, argc, argv, mode, what, ret);
......
...@@ -38,7 +38,7 @@ final class CDropTargetContextPeer extends SunDropTargetContextPeer { ...@@ -38,7 +38,7 @@ final class CDropTargetContextPeer extends SunDropTargetContextPeer {
private long fNativeDropTransfer = 0; private long fNativeDropTransfer = 0;
private long fNativeDataAvailable = 0; private long fNativeDataAvailable = 0;
private Object fNativeData = null; private Object fNativeData = null;
private boolean insideTarget = false; private boolean insideTarget = true;
Object awtLockAccess = new Object(); Object awtLockAccess = new Object();
......
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -115,6 +115,8 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -115,6 +115,8 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
static final int RESIZABLE = 1 << 9; // both a style bit and prop bit static final int RESIZABLE = 1 << 9; // both a style bit and prop bit
static final int NONACTIVATING = 1 << 24; static final int NONACTIVATING = 1 << 24;
static final int IS_DIALOG = 1 << 25;
static final int IS_MODAL = 1 << 26;
static final int _STYLE_PROP_BITMASK = DECORATED | TEXTURED | UNIFIED | UTILITY | HUD | SHEET | CLOSEABLE | MINIMIZABLE | RESIZABLE; static final int _STYLE_PROP_BITMASK = DECORATED | TEXTURED | UNIFIED | UTILITY | HUD | SHEET | CLOSEABLE | MINIMIZABLE | RESIZABLE;
...@@ -374,6 +376,13 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo ...@@ -374,6 +376,13 @@ public class CPlatformWindow extends CFRetainedResource implements PlatformWindo
} }
} }
if (isDialog) {
styleBits = SET(styleBits, IS_DIALOG, true);
if (((Dialog) target).isModal()) {
styleBits = SET(styleBits, IS_MODAL, true);
}
}
peer.setTextured(IS(TEXTURED, styleBits)); peer.setTextured(IS(TEXTURED, styleBits));
return styleBits; return styleBits;
......
...@@ -36,6 +36,7 @@ import java.security.PrivilegedAction; ...@@ -36,6 +36,7 @@ import java.security.PrivilegedAction;
import javax.print.*; import javax.print.*;
import javax.print.attribute.PrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.standard.PageRanges;
import sun.java2d.*; import sun.java2d.*;
import sun.print.*; import sun.print.*;
...@@ -173,6 +174,19 @@ public class CPrinterJob extends RasterPrinterJob { ...@@ -173,6 +174,19 @@ public class CPrinterJob extends RasterPrinterJob {
if (nsPrintInfo != null) { if (nsPrintInfo != null) {
fNSPrintInfo = nsPrintInfo.getValue(); fNSPrintInfo = nsPrintInfo.getValue();
} }
PageRanges pageRangesAttr = (PageRanges)attributes.get(PageRanges.class);
if (isSupportedValue(pageRangesAttr, attributes)) {
SunPageSelection rangeSelect = (SunPageSelection)attributes.get(SunPageSelection.class);
// If rangeSelect is not null, we are using AWT's print dialog that has
// All, Selection, and Range radio buttons
if (rangeSelect == null || rangeSelect == SunPageSelection.RANGE) {
int[][] range = pageRangesAttr.getMembers();
// setPageRange will set firstPage and lastPage as called in getFirstPage
// and getLastPage
setPageRange(range[0][0] - 1, range[0][1] - 1);
}
}
} }
volatile boolean onEventThread; volatile boolean onEventThread;
...@@ -225,7 +239,6 @@ public class CPrinterJob extends RasterPrinterJob { ...@@ -225,7 +239,6 @@ public class CPrinterJob extends RasterPrinterJob {
* the end of the document. Note that firstPage * the end of the document. Note that firstPage
* and lastPage are 0 based page indices. * and lastPage are 0 based page indices.
*/ */
int numPages = mDocument.getNumberOfPages();
int firstPage = getFirstPage(); int firstPage = getFirstPage();
int lastPage = getLastPage(); int lastPage = getLastPage();
...@@ -242,42 +255,53 @@ public class CPrinterJob extends RasterPrinterJob { ...@@ -242,42 +255,53 @@ public class CPrinterJob extends RasterPrinterJob {
userCancelled = false; userCancelled = false;
} }
if (EventQueue.isDispatchThread()) { //Add support for PageRange
// This is an AWT EventQueue, and this print rendering loop needs to block it. PageRanges pr = (attributes == null) ? null
: (PageRanges)attributes.get(PageRanges.class);
int[][] prMembers = (pr == null) ? new int[0][0] : pr.getMembers();
int loopi = 0;
do {
if (EventQueue.isDispatchThread()) {
// This is an AWT EventQueue, and this print rendering loop needs to block it.
onEventThread = true;
printingLoop = AccessController.doPrivileged(new PrivilegedAction<SecondaryLoop>() {
@Override
public SecondaryLoop run() {
return Toolkit.getDefaultToolkit()
.getSystemEventQueue()
.createSecondaryLoop();
}
});
onEventThread = true; try {
// Fire off the print rendering loop on the AppKit thread, and don't have
printingLoop = AccessController.doPrivileged(new PrivilegedAction<SecondaryLoop>() { // it wait and block this thread.
@Override if (printLoop(false, firstPage, lastPage)) {
public SecondaryLoop run() { // Start a secondary loop on EDT until printing operation is finished or cancelled
return Toolkit.getDefaultToolkit() printingLoop.enter();
.getSystemEventQueue() }
.createSecondaryLoop(); } catch (Exception e) {
e.printStackTrace();
} }
}); } else {
// Fire off the print rendering loop on the AppKit, and block this thread
// until it is done.
// But don't actually block... we need to come back here!
onEventThread = false;
try { try {
// Fire off the print rendering loop on the AppKit thread, and don't have printLoop(true, firstPage, lastPage);
// it wait and block this thread. } catch (Exception e) {
if (printLoop(false, firstPage, lastPage)) { e.printStackTrace();
// Start a secondary loop on EDT until printing operation is finished or cancelled
printingLoop.enter();
} }
} catch (Exception e) {
e.printStackTrace();
} }
} else { if (++loopi < prMembers.length) {
// Fire off the print rendering loop on the AppKit, and block this thread firstPage = prMembers[loopi][0]-1;
// until it is done. lastPage = prMembers[loopi][1] -1;
// But don't actually block... we need to come back here!
onEventThread = false;
try {
printLoop(true, firstPage, lastPage);
} catch (Exception e) {
e.printStackTrace();
} }
} } while (loopi < prMembers.length);
} finally { } finally {
synchronized (this) { synchronized (this) {
// NOTE: Native code shouldn't allow exceptions out while // NOTE: Native code shouldn't allow exceptions out while
......
/* /*
* Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -536,8 +536,12 @@ AWT_ASSERT_APPKIT_THREAD; ...@@ -536,8 +536,12 @@ AWT_ASSERT_APPKIT_THREAD;
- (void) windowDidBecomeKey: (NSNotification *) notification { - (void) windowDidBecomeKey: (NSNotification *) notification {
AWT_ASSERT_APPKIT_THREAD; AWT_ASSERT_APPKIT_THREAD;
[AWTToolkit eventCountPlusPlus]; [AWTToolkit eventCountPlusPlus];
[CMenuBar activate:self.javaMenuBar modallyDisabled:NO];
AWTWindow *opposite = [AWTWindow lastKeyWindow]; AWTWindow *opposite = [AWTWindow lastKeyWindow];
if (!IS(self.styleBits, IS_DIALOG)) {
[CMenuBar activate:self.javaMenuBar modallyDisabled:NO];
} else if (IS(self.styleBits, IS_MODAL)) {
[CMenuBar activate:opposite->javaMenuBar modallyDisabled:YES];
}
[AWTWindow setLastKeyWindow:nil]; [AWTWindow setLastKeyWindow:nil];
[self _deliverWindowFocusEvent:YES oppositeWindow: opposite]; [self _deliverWindowFocusEvent:YES oppositeWindow: opposite];
......
...@@ -395,6 +395,7 @@ JNF_COCOA_EXIT(env); ...@@ -395,6 +395,7 @@ JNF_COCOA_EXIT(env);
#pragma mark --- Miscellaneous JNI --- #pragma mark --- Miscellaneous JNI ---
#ifndef HEADLESS
/* /*
* Class: sun_awt_PlatformFont * Class: sun_awt_PlatformFont
* Method: initIDs * Method: initIDs
...@@ -416,3 +417,4 @@ Java_sun_awt_FontDescriptor_initIDs ...@@ -416,3 +417,4 @@ Java_sun_awt_FontDescriptor_initIDs
(JNIEnv *env, jclass cls) (JNIEnv *env, jclass cls)
{ {
} }
#endif
/* /*
* Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -24,6 +24,9 @@ ...@@ -24,6 +24,9 @@
*/ */
package com.sun.beans.finder; package com.sun.beans.finder;
import java.lang.reflect.Executable;
import java.lang.reflect.Modifier;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
...@@ -37,7 +40,7 @@ import java.util.Map; ...@@ -37,7 +40,7 @@ import java.util.Map;
* *
* @author Sergey A. Malenkov * @author Sergey A. Malenkov
*/ */
abstract class AbstractFinder<T> { abstract class AbstractFinder<T extends Executable> {
private final Class<?>[] args; private final Class<?>[] args;
/** /**
...@@ -52,27 +55,6 @@ abstract class AbstractFinder<T> { ...@@ -52,27 +55,6 @@ abstract class AbstractFinder<T> {
this.args = args; this.args = args;
} }
/**
* Returns an array of {@code Class} objects
* that represent the formal parameter types of the method.
* Returns an empty array if the method takes no parameters.
*
* @param method the object that represents method
* @return the parameter types of the method
*/
protected abstract Class<?>[] getParameters(T method);
/**
* Returns {@code true} if and only if the method
* was declared to take a variable number of arguments.
*
* @param method the object that represents method
* @return {@code true} if the method was declared
* to take a variable number of arguments;
* {@code false} otherwise
*/
protected abstract boolean isVarArgs(T method);
/** /**
* Checks validness of the method. * Checks validness of the method.
* At least the valid method should be public. * At least the valid method should be public.
...@@ -81,7 +63,9 @@ abstract class AbstractFinder<T> { ...@@ -81,7 +63,9 @@ abstract class AbstractFinder<T> {
* @return {@code true} if the method is valid, * @return {@code true} if the method is valid,
* {@code false} otherwise * {@code false} otherwise
*/ */
protected abstract boolean isValid(T method); protected boolean isValid(T method) {
return Modifier.isPublic(method.getModifiers());
}
/** /**
* Performs a search in the {@code methods} array. * Performs a search in the {@code methods} array.
...@@ -109,7 +93,7 @@ abstract class AbstractFinder<T> { ...@@ -109,7 +93,7 @@ abstract class AbstractFinder<T> {
for (T newMethod : methods) { for (T newMethod : methods) {
if (isValid(newMethod)) { if (isValid(newMethod)) {
Class<?>[] newParams = getParameters(newMethod); Class<?>[] newParams = newMethod.getParameterTypes();
if (newParams.length == this.args.length) { if (newParams.length == this.args.length) {
PrimitiveWrapperMap.replacePrimitivesWithWrappers(newParams); PrimitiveWrapperMap.replacePrimitivesWithWrappers(newParams);
if (isAssignable(newParams, this.args)) { if (isAssignable(newParams, this.args)) {
...@@ -120,6 +104,11 @@ abstract class AbstractFinder<T> { ...@@ -120,6 +104,11 @@ abstract class AbstractFinder<T> {
boolean useNew = isAssignable(oldParams, newParams); boolean useNew = isAssignable(oldParams, newParams);
boolean useOld = isAssignable(newParams, oldParams); boolean useOld = isAssignable(newParams, oldParams);
if (useOld && useNew) {
// only if parameters are equal
useNew = !newMethod.isSynthetic();
useOld = !oldMethod.isSynthetic();
}
if (useOld == useNew) { if (useOld == useNew) {
ambiguous = true; ambiguous = true;
} else if (useNew) { } else if (useNew) {
...@@ -130,7 +119,7 @@ abstract class AbstractFinder<T> { ...@@ -130,7 +119,7 @@ abstract class AbstractFinder<T> {
} }
} }
} }
if (isVarArgs(newMethod)) { if (newMethod.isVarArgs()) {
int length = newParams.length - 1; int length = newParams.length - 1;
if (length <= this.args.length) { if (length <= this.args.length) {
Class<?>[] array = new Class<?>[this.args.length]; Class<?>[] array = new Class<?>[this.args.length];
...@@ -160,6 +149,11 @@ abstract class AbstractFinder<T> { ...@@ -160,6 +149,11 @@ abstract class AbstractFinder<T> {
boolean useNew = isAssignable(oldParams, newParams); boolean useNew = isAssignable(oldParams, newParams);
boolean useOld = isAssignable(newParams, oldParams); boolean useOld = isAssignable(newParams, oldParams);
if (useOld && useNew) {
// only if parameters are equal
useNew = !newMethod.isSynthetic();
useOld = !oldMethod.isSynthetic();
}
if (useOld == useNew) { if (useOld == useNew) {
if (oldParams == map.get(oldMethod)) { if (oldParams == map.get(oldMethod)) {
ambiguous = true; ambiguous = true;
......
/* /*
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -86,44 +86,4 @@ public final class ConstructorFinder extends AbstractFinder<Constructor<?>> { ...@@ -86,44 +86,4 @@ public final class ConstructorFinder extends AbstractFinder<Constructor<?>> {
private ConstructorFinder(Class<?>[] args) { private ConstructorFinder(Class<?>[] args) {
super(args); super(args);
} }
/**
* Returns an array of {@code Class} objects
* that represent the formal parameter types of the constructor.
* Returns an empty array if the constructor takes no parameters.
*
* @param constructor the object that represents constructor
* @return the parameter types of the constructor
*/
@Override
protected Class<?>[] getParameters(Constructor<?> constructor) {
return constructor.getParameterTypes();
}
/**
* Returns {@code true} if and only if the constructor
* was declared to take a variable number of arguments.
*
* @param constructor the object that represents constructor
* @return {@code true} if the constructor was declared
* to take a variable number of arguments;
* {@code false} otherwise
*/
@Override
protected boolean isVarArgs(Constructor<?> constructor) {
return constructor.isVarArgs();
}
/**
* Checks validness of the constructor.
* The valid constructor should be public.
*
* @param constructor the object that represents constructor
* @return {@code true} if the constructor is valid,
* {@code false} otherwise
*/
@Override
protected boolean isValid(Constructor<?> constructor) {
return Modifier.isPublic(constructor.getModifiers());
}
} }
/* /*
* Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -195,33 +195,6 @@ public final class MethodFinder extends AbstractFinder<Method> { ...@@ -195,33 +195,6 @@ public final class MethodFinder extends AbstractFinder<Method> {
this.name = name; this.name = name;
} }
/**
* Returns an array of {@code Class} objects
* that represent the formal parameter types of the method.
* Returns an empty array if the method takes no parameters.
*
* @param method the object that represents method
* @return the parameter types of the method
*/
@Override
protected Class<?>[] getParameters(Method method) {
return method.getParameterTypes();
}
/**
* Returns {@code true} if and only if the method
* was declared to take a variable number of arguments.
*
* @param method the object that represents method
* @return {@code true} if the method was declared
* to take a variable number of arguments;
* {@code false} otherwise
*/
@Override
protected boolean isVarArgs(Method method) {
return method.isVarArgs();
}
/** /**
* Checks validness of the method. * Checks validness of the method.
* The valid method should be public and * The valid method should be public and
...@@ -233,6 +206,6 @@ public final class MethodFinder extends AbstractFinder<Method> { ...@@ -233,6 +206,6 @@ public final class MethodFinder extends AbstractFinder<Method> {
*/ */
@Override @Override
protected boolean isValid(Method method) { protected boolean isValid(Method method) {
return !method.isBridge() && Modifier.isPublic(method.getModifiers()) && method.getName().equals(this.name); return super.isValid(method) && method.getName().equals(this.name);
} }
} }
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -90,14 +90,16 @@ public class Continuation extends ResolveResult { ...@@ -90,14 +90,16 @@ public class Continuation extends ResolveResult {
* Constructs a new instance of Continuation. * Constructs a new instance of Continuation.
* @param top The name of the object that is to be resolved/operated upon. * @param top The name of the object that is to be resolved/operated upon.
* This becomes the Continuation's 'starter' and is used to * This becomes the Continuation's 'starter' and is used to
* calculate the "resolved name" when filling in a NamingException. * calculate the "resolved name" when filling in a NamingException.
* @param environment The environment used by the caller. It is used * @param environment The environment used by the caller. It is used
* when setting the "environment" of a CannotProceedException. * when setting the "environment" of a CannotProceedException.
*/ */
@SuppressWarnings("unchecked") // For Hashtable clone: environment.clone()
public Continuation(Name top, Hashtable<?,?> environment) { public Continuation(Name top, Hashtable<?,?> environment) {
super(); super();
starter = top; starter = top;
this.environment = environment; this.environment = (Hashtable<?,?>)
((environment == null) ? null : environment.clone());
} }
/** /**
......
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -69,6 +69,7 @@ final public class LazySearchEnumerationImpl ...@@ -69,6 +69,7 @@ final public class LazySearchEnumerationImpl
} }
} }
@SuppressWarnings("unchecked") // For Hashtable clone: env.clone()
public LazySearchEnumerationImpl(NamingEnumeration<Binding> candidates, public LazySearchEnumerationImpl(NamingEnumeration<Binding> candidates,
AttrFilter filter, SearchControls cons, AttrFilter filter, SearchControls cons,
Context ctx, Hashtable<String, Object> env, boolean useFactory) Context ctx, Hashtable<String, Object> env, boolean useFactory)
...@@ -76,7 +77,8 @@ final public class LazySearchEnumerationImpl ...@@ -76,7 +77,8 @@ final public class LazySearchEnumerationImpl
this.candidates = candidates; this.candidates = candidates;
this.filter = filter; this.filter = filter;
this.env = env; this.env = (Hashtable<String, Object>)
((env == null) ? null : env.clone());
this.context = ctx; this.context = ctx;
this.useFactory = useFactory; this.useFactory = useFactory;
......
/* /*
* Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -53,7 +53,8 @@ abstract public class GenericURLContext implements Context { ...@@ -53,7 +53,8 @@ abstract public class GenericURLContext implements Context {
@SuppressWarnings("unchecked") // Expect Hashtable<String, Object> @SuppressWarnings("unchecked") // Expect Hashtable<String, Object>
public GenericURLContext(Hashtable<?,?> env) { public GenericURLContext(Hashtable<?,?> env) {
// context that is not tied to any specific URL // context that is not tied to any specific URL
myEnv = (Hashtable<String, Object>)env; // copied on write myEnv =
(Hashtable<String, Object>)(env == null ? null : env.clone());
} }
public void close() throws NamingException { public void close() throws NamingException {
...@@ -488,22 +489,19 @@ abstract public class GenericURLContext implements Context { ...@@ -488,22 +489,19 @@ abstract public class GenericURLContext implements Context {
return result; return result;
} }
@SuppressWarnings("unchecked") // clone()
public Object removeFromEnvironment(String propName) public Object removeFromEnvironment(String propName)
throws NamingException { throws NamingException {
if (myEnv == null) { if (myEnv == null) {
return null; return null;
} }
myEnv = (Hashtable<String, Object>)myEnv.clone();
return myEnv.remove(propName); return myEnv.remove(propName);
} }
@SuppressWarnings("unchecked") // clone()
public Object addToEnvironment(String propName, Object propVal) public Object addToEnvironment(String propName, Object propVal)
throws NamingException { throws NamingException {
myEnv = (myEnv == null) if (myEnv == null) {
? new Hashtable<String, Object>(11, 0.75f) myEnv = new Hashtable<String, Object>(11, 0.75f);
: (Hashtable<String, Object>)myEnv.clone(); }
return myEnv.put(propName, propVal); return myEnv.put(propName, propVal);
} }
......
...@@ -240,13 +240,15 @@ class FileInputStream extends InputStream ...@@ -240,13 +240,15 @@ class FileInputStream extends InputStream
* *
* <p>The <code>skip</code> method may, for a variety of * <p>The <code>skip</code> method may, for a variety of
* reasons, end up skipping over some smaller number of bytes, * reasons, end up skipping over some smaller number of bytes,
* possibly <code>0</code>. If <code>n</code> is negative, an * possibly <code>0</code>. If <code>n</code> is negative, the method
* <code>IOException</code> is thrown, even though the <code>skip</code> * will try to skip backwards. In case the backing file does not support
* method of the {@link InputStream} superclass does nothing in this case. * backward skip at its current position, an <code>IOException</code> is
* The actual number of bytes skipped is returned. * thrown. The actual number of bytes skipped is returned. If it skips
* forwards, it returns a positive value. If it skips backwards, it
* returns a negative value.
* *
* <p>This method may skip more bytes than are remaining in the backing * <p>This method may skip more bytes than what are remaining in the
* file. This produces no exception and the number of bytes skipped * backing file. This produces no exception and the number of bytes skipped
* may include some number of bytes that were beyond the EOF of the * may include some number of bytes that were beyond the EOF of the
* backing file. Attempting to read from the stream after skipping past * backing file. Attempting to read from the stream after skipping past
* the end will result in -1 indicating the end of the file. * the end will result in -1 indicating the end of the file.
...@@ -261,9 +263,10 @@ class FileInputStream extends InputStream ...@@ -261,9 +263,10 @@ class FileInputStream extends InputStream
/** /**
* Returns an estimate of the number of remaining bytes that can be read (or * Returns an estimate of the number of remaining bytes that can be read (or
* skipped over) from this input stream without blocking by the next * skipped over) from this input stream without blocking by the next
* invocation of a method for this input stream. The next invocation might be * invocation of a method for this input stream. Returns 0 when the file
* the same thread or another thread. A single read or skip of this * position is beyond EOF. The next invocation might be the same thread
* many bytes will not block, but may read or skip fewer bytes. * or another thread. A single read or skip of this many bytes will not
* block, but may read or skip fewer bytes.
* *
* <p> In some cases, a non-blocking read (or skip) may appear to be * <p> In some cases, a non-blocking read (or skip) may appear to be
* blocked when it is merely slow, for example when reading large * blocked when it is merely slow, for example when reading large
......
/* /*
* Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -193,8 +193,10 @@ public abstract class InputStream implements Closeable { ...@@ -193,8 +193,10 @@ public abstract class InputStream implements Closeable {
* up skipping over some smaller number of bytes, possibly <code>0</code>. * up skipping over some smaller number of bytes, possibly <code>0</code>.
* This may result from any of a number of conditions; reaching end of file * This may result from any of a number of conditions; reaching end of file
* before <code>n</code> bytes have been skipped is only one possibility. * before <code>n</code> bytes have been skipped is only one possibility.
* The actual number of bytes skipped is returned. If <code>n</code> is * The actual number of bytes skipped is returned. If {@code n} is
* negative, no bytes are skipped. * negative, the {@code skip} method for class {@code InputStream} always
* returns 0, and no bytes are skipped. Subclasses may handle the negative
* value differently.
* *
* <p> The <code>skip</code> method of this class creates a * <p> The <code>skip</code> method of this class creates a
* byte array and then repeatedly reads into it until <code>n</code> bytes * byte array and then repeatedly reads into it until <code>n</code> bytes
......
...@@ -28,6 +28,7 @@ package java.lang; ...@@ -28,6 +28,7 @@ package java.lang;
import java.lang.reflect.AnnotatedElement; import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.lang.reflect.GenericArrayType; import java.lang.reflect.GenericArrayType;
import java.lang.reflect.GenericDeclaration;
import java.lang.reflect.Member; import java.lang.reflect.Member;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Executable; import java.lang.reflect.Executable;
...@@ -115,9 +116,9 @@ import sun.reflect.misc.ReflectUtil; ...@@ -115,9 +116,9 @@ import sun.reflect.misc.ReflectUtil;
* @since JDK1.0 * @since JDK1.0
*/ */
public final class Class<T> implements java.io.Serializable, public final class Class<T> implements java.io.Serializable,
java.lang.reflect.GenericDeclaration, GenericDeclaration,
java.lang.reflect.Type, Type,
java.lang.reflect.AnnotatedElement { AnnotatedElement {
private static final int ANNOTATION= 0x00002000; private static final int ANNOTATION= 0x00002000;
private static final int ENUM = 0x00004000; private static final int ENUM = 0x00004000;
private static final int SYNTHETIC = 0x00001000; private static final int SYNTHETIC = 0x00001000;
...@@ -3182,7 +3183,7 @@ public final class Class<T> implements java.io.Serializable, ...@@ -3182,7 +3183,7 @@ public final class Class<T> implements java.io.Serializable,
*/ */
@Override @Override
public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) { public boolean isAnnotationPresent(Class<? extends Annotation> annotationClass) {
return AnnotatedElement.super.isAnnotationPresent(annotationClass); return GenericDeclaration.super.isAnnotationPresent(annotationClass);
} }
/** /**
......
...@@ -1010,13 +1010,14 @@ public final class String ...@@ -1010,13 +1010,14 @@ public final class String
private boolean nonSyncContentEquals(AbstractStringBuilder sb) { private boolean nonSyncContentEquals(AbstractStringBuilder sb) {
char v1[] = value; char v1[] = value;
char v2[] = sb.getValue(); char v2[] = sb.getValue();
int i = 0; int n = v1.length;
int n = value.length; if (n != sb.length()) {
while (n-- != 0) { return false;
}
for (int i = 0; i < n; i++) {
if (v1[i] != v2[i]) { if (v1[i] != v2[i]) {
return false; return false;
} }
i++;
} }
return true; return true;
} }
...@@ -1038,8 +1039,6 @@ public final class String ...@@ -1038,8 +1039,6 @@ public final class String
* @since 1.5 * @since 1.5
*/ */
public boolean contentEquals(CharSequence cs) { public boolean contentEquals(CharSequence cs) {
if (value.length != cs.length())
return false;
// Argument is a StringBuffer, StringBuilder // Argument is a StringBuffer, StringBuilder
if (cs instanceof AbstractStringBuilder) { if (cs instanceof AbstractStringBuilder) {
if (cs instanceof StringBuffer) { if (cs instanceof StringBuffer) {
...@@ -1055,12 +1054,14 @@ public final class String ...@@ -1055,12 +1054,14 @@ public final class String
return true; return true;
// Argument is a generic CharSequence // Argument is a generic CharSequence
char v1[] = value; char v1[] = value;
int i = 0; int n = v1.length;
int n = value.length; if (n != cs.length()) {
while (n-- != 0) { return false;
if (v1[i] != cs.charAt(i)) }
for (int i = 0; i < n; i++) {
if (v1[i] != cs.charAt(i)) {
return false; return false;
i++; }
} }
return true; return true;
} }
......
...@@ -335,10 +335,8 @@ import java.util.Arrays; ...@@ -335,10 +335,8 @@ import java.util.Arrays;
* @since 1.5 * @since 1.5
*/ */
@Override @Override
public StringBuffer append(CharSequence s) { public synchronized StringBuffer append(CharSequence s) {
// Note, synchronization achieved via invocations of other StringBuffer methods after toStringCache = null;
// narrowing of s to specific type
// Ditto for toStringCache clearing
super.append(s); super.append(s);
return this; return this;
} }
......
...@@ -145,10 +145,10 @@ class Thread implements Runnable { ...@@ -145,10 +145,10 @@ class Thread implements Runnable {
registerNatives(); registerNatives();
} }
private char name[]; private volatile char name[];
private int priority; private int priority;
private Thread threadQ; private Thread threadQ;
private long eetop; private long eetop;
/* Whether or not to single_step this thread. */ /* Whether or not to single_step this thread. */
private boolean single_step; private boolean single_step;
...@@ -1135,7 +1135,7 @@ class Thread implements Runnable { ...@@ -1135,7 +1135,7 @@ class Thread implements Runnable {
* @see #getName * @see #getName
* @see #checkAccess() * @see #checkAccess()
*/ */
public final void setName(String name) { public final synchronized void setName(String name) {
checkAccess(); checkAccess();
this.name = name.toCharArray(); this.name = name.toCharArray();
if (threadStatus != 0) { if (threadStatus != 0) {
...@@ -1150,7 +1150,7 @@ class Thread implements Runnable { ...@@ -1150,7 +1150,7 @@ class Thread implements Runnable {
* @see #setName(String) * @see #setName(String)
*/ */
public final String getName() { public final String getName() {
return String.valueOf(name); return new String(name, true);
} }
/** /**
......
/* /*
* Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -138,8 +138,23 @@ public abstract class Reference<T> { ...@@ -138,8 +138,23 @@ public abstract class Reference<T> {
pending = r.discovered; pending = r.discovered;
r.discovered = null; r.discovered = null;
} else { } else {
// The waiting on the lock may cause an OOME because it may try to allocate
// exception objects, so also catch OOME here to avoid silent exit of the
// reference handler thread.
//
// Explicitly define the order of the two exceptions we catch here
// when waiting for the lock.
//
// We do not want to try to potentially load the InterruptedException class
// (which would be done if this was its first use, and InterruptedException
// were checked first) in this situation.
//
// This may lead to the VM not ever trying to load the InterruptedException
// class again.
try { try {
lock.wait(); try {
lock.wait();
} catch (OutOfMemoryError x) { }
} catch (InterruptedException x) { } } catch (InterruptedException x) { }
continue; continue;
} }
......
/* /*
* Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -30,7 +30,7 @@ package java.lang.reflect; ...@@ -30,7 +30,7 @@ package java.lang.reflect;
* *
* @since 1.5 * @since 1.5
*/ */
public interface GenericDeclaration { public interface GenericDeclaration extends AnnotatedElement {
/** /**
* Returns an array of {@code TypeVariable} objects that * Returns an array of {@code TypeVariable} objects that
* represent the type variables declared by the generic * represent the type variables declared by the generic
......
...@@ -34,6 +34,7 @@ import java.nio.BufferOverflowException; ...@@ -34,6 +34,7 @@ import java.nio.BufferOverflowException;
import java.nio.BufferUnderflowException; import java.nio.BufferUnderflowException;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.nio.charset.CoderMalfunctionError; // javadoc import java.nio.charset.CoderMalfunctionError; // javadoc
import java.util.Arrays;
/** /**
...@@ -244,7 +245,12 @@ public abstract class Charset$Coder$ { ...@@ -244,7 +245,12 @@ public abstract class Charset$Coder$ {
* which is never <tt>null</tt> and is never empty * which is never <tt>null</tt> and is never empty
*/ */
public final $replType$ replacement() { public final $replType$ replacement() {
#if[decoder]
return replacement; return replacement;
#end[decoder]
#if[encoder]
return Arrays.copyOf(replacement, replacement.$replLength$);
#end[encoder]
} }
/** /**
...@@ -280,12 +286,15 @@ public abstract class Charset$Coder$ { ...@@ -280,12 +286,15 @@ public abstract class Charset$Coder$ {
throw new IllegalArgumentException("Empty replacement"); throw new IllegalArgumentException("Empty replacement");
if (len > max$ItypesPerOtype$) if (len > max$ItypesPerOtype$)
throw new IllegalArgumentException("Replacement too long"); throw new IllegalArgumentException("Replacement too long");
#if[decoder]
this.replacement = newReplacement;
#end[decoder]
#if[encoder] #if[encoder]
if (!isLegalReplacement(newReplacement)) if (!isLegalReplacement(newReplacement))
throw new IllegalArgumentException("Illegal replacement"); throw new IllegalArgumentException("Illegal replacement");
this.replacement = Arrays.copyOf(newReplacement, newReplacement.$replLength$);
#end[encoder] #end[encoder]
this.replacement = newReplacement; implReplaceWith(this.replacement);
implReplaceWith(newReplacement);
return this; return this;
} }
......
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package java.nio.file;
import java.io.Closeable;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.Arrays;
import java.util.Iterator;
import java.util.NoSuchElementException;
import java.util.Objects;
import java.nio.file.FileTreeWalker.Event;
/**
* An {@code Iterator to iterate over the nodes of a file tree.
*
* <pre>{@code
* try (FileTreeIterator iterator = new FileTreeIterator(start, maxDepth, options)) {
* while (iterator.hasNext()) {
* Event ev = iterator.next();
* Path path = ev.file();
* BasicFileAttributes attrs = ev.attributes();
* }
* }
* }</pre>
*/
class FileTreeIterator implements Iterator<Event>, Closeable {
private final FileTreeWalker walker;
private Event next;
/**
* Creates a new iterator to walk the file tree starting at the given file.
*
* @throws IllegalArgumentException
* if {@code maxDepth} is negative
* @throws IOException
* if an I/O errors occurs opening the starting file
* @throws SecurityException
* if the security manager denies access to the starting file
* @throws NullPointerException
* if {@code start} or {@code options} is {@ocde null} or
* the options array contains a {@code null} element
*/
FileTreeIterator(Path start, int maxDepth, FileVisitOption... options)
throws IOException
{
this.walker = new FileTreeWalker(Arrays.asList(options), maxDepth);
this.next = walker.walk(start);
assert next.type() == FileTreeWalker.EventType.ENTRY ||
next.type() == FileTreeWalker.EventType.START_DIRECTORY;
// IOException if there a problem accessing the starting file
IOException ioe = next.ioeException();
if (ioe != null)
throw ioe;
}
private void fetchNextIfNeeded() {
if (next == null) {
FileTreeWalker.Event ev = walker.next();
while (ev != null) {
IOException ioe = ev.ioeException();
if (ioe != null)
throw new UncheckedIOException(ioe);
// END_DIRECTORY events are ignored
if (ev.type() != FileTreeWalker.EventType.END_DIRECTORY) {
next = ev;
return;
}
ev = walker.next();
}
}
}
@Override
public boolean hasNext() {
if (!walker.isOpen())
throw new IllegalStateException();
fetchNextIfNeeded();
return next != null;
}
@Override
public Event next() {
if (!walker.isOpen())
throw new IllegalStateException();
fetchNextIfNeeded();
if (next == null)
throw new NoSuchElementException();
Event result = next;
next = null;
return result;
}
@Override
public void close() {
walker.close();
}
}
...@@ -29,8 +29,8 @@ import java.nio.file.attribute.BasicFileAttributes; ...@@ -29,8 +29,8 @@ import java.nio.file.attribute.BasicFileAttributes;
import java.io.Closeable; import java.io.Closeable;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.Collection;
import java.util.Iterator; import java.util.Iterator;
import java.util.Set;
import sun.nio.fs.BasicFileAttributesHolder; import sun.nio.fs.BasicFileAttributesHolder;
/** /**
...@@ -164,8 +164,17 @@ class FileTreeWalker implements Closeable { ...@@ -164,8 +164,17 @@ class FileTreeWalker implements Closeable {
/** /**
* Creates a {@code FileTreeWalker}. * Creates a {@code FileTreeWalker}.
*
* @throws IllegalArgumentException
* if {@code maxDepth} is negative
* @throws ClassCastException
* if (@code options} contains an element that is not a
* {@code FileVisitOption}
* @throws NullPointerException
* if {@code options} is {@ocde null} or the options
* array contains a {@code null} element
*/ */
FileTreeWalker(Set<FileVisitOption> options, int maxDepth) { FileTreeWalker(Collection<FileVisitOption> options, int maxDepth) {
boolean fl = false; boolean fl = false;
for (FileVisitOption option: options) { for (FileVisitOption option: options) {
// will throw NPE if options contains null // will throw NPE if options contains null
...@@ -175,6 +184,9 @@ class FileTreeWalker implements Closeable { ...@@ -175,6 +184,9 @@ class FileTreeWalker implements Closeable {
throw new AssertionError("Should not get here"); throw new AssertionError("Should not get here");
} }
} }
if (maxDepth < 0)
throw new IllegalArgumentException("'maxDepth' is negative");
this.followLinks = fl; this.followLinks = fl;
this.linkOptions = (fl) ? new LinkOption[0] : this.linkOptions = (fl) ? new LinkOption[0] :
new LinkOption[] { LinkOption.NOFOLLOW_LINKS }; new LinkOption[] { LinkOption.NOFOLLOW_LINKS };
......
...@@ -25,10 +25,13 @@ ...@@ -25,10 +25,13 @@
package java.nio.file; package java.nio.file;
import java.nio.ByteBuffer;
import java.nio.file.attribute.*; import java.nio.file.attribute.*;
import java.nio.file.spi.FileSystemProvider; import java.nio.file.spi.FileSystemProvider;
import java.nio.file.spi.FileTypeDetector; import java.nio.file.spi.FileTypeDetector;
import java.nio.channels.FileChannel;
import java.nio.channels.SeekableByteChannel; import java.nio.channels.SeekableByteChannel;
import java.io.Closeable;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.io.Reader; import java.io.Reader;
...@@ -38,7 +41,13 @@ import java.io.BufferedWriter; ...@@ -38,7 +41,13 @@ import java.io.BufferedWriter;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.io.IOException; import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.*; import java.util.*;
import java.util.function.BiPredicate;
import java.util.stream.CloseableStream;
import java.util.stream.DelegatingStream;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.nio.charset.Charset; import java.nio.charset.Charset;
...@@ -2587,9 +2596,6 @@ public final class Files { ...@@ -2587,9 +2596,6 @@ public final class Files {
FileVisitor<? super Path> visitor) FileVisitor<? super Path> visitor)
throws IOException throws IOException
{ {
if (maxDepth < 0)
throw new IllegalArgumentException("'maxDepth' is negative");
/** /**
* Create a FileTreeWalker to walk the file tree, invoking the visitor * Create a FileTreeWalker to walk the file tree, invoking the visitor
* for each event. * for each event.
...@@ -2940,40 +2946,6 @@ public final class Files { ...@@ -2940,40 +2946,6 @@ public final class Files {
} }
} }
/**
* Read all the bytes from an input stream. The {@code initialSize}
* parameter indicates the initial size of the byte[] to allocate.
*/
private static byte[] read(InputStream source, int initialSize)
throws IOException
{
int capacity = initialSize;
byte[] buf = new byte[capacity];
int nread = 0;
int rem = buf.length;
int n;
// read to EOF which may read more or less than initialSize (eg: file
// is truncated while we are reading)
while ((n = source.read(buf, nread, rem)) > 0) {
nread += n;
rem -= n;
assert rem >= 0;
if (rem == 0) {
// need larger buffer
int newCapacity = capacity << 1;
if (newCapacity < 0) {
if (capacity == Integer.MAX_VALUE)
throw new OutOfMemoryError("Required array size too large");
newCapacity = Integer.MAX_VALUE;
}
rem = newCapacity - capacity;
buf = Arrays.copyOf(buf, newCapacity);
capacity = newCapacity;
}
}
return (capacity == nread) ? buf : Arrays.copyOf(buf, nread);
}
/** /**
* Read all the bytes from a file. The method ensures that the file is * Read all the bytes from a file. The method ensures that the file is
* closed when all bytes have been read or an I/O error, or other runtime * closed when all bytes have been read or an I/O error, or other runtime
...@@ -2999,12 +2971,22 @@ public final class Files { ...@@ -2999,12 +2971,22 @@ public final class Files {
* method is invoked to check read access to the file. * method is invoked to check read access to the file.
*/ */
public static byte[] readAllBytes(Path path) throws IOException { public static byte[] readAllBytes(Path path) throws IOException {
long size = size(path); try (FileChannel fc = FileChannel.open(path)) {
if (size > (long)Integer.MAX_VALUE) long size = fc.size();
throw new OutOfMemoryError("Required array size too large"); if (size > (long)Integer.MAX_VALUE)
throw new OutOfMemoryError("Required array size too large");
byte[] arr = new byte[(int)size];
ByteBuffer bb = ByteBuffer.wrap(arr);
while (bb.hasRemaining()) {
if (fc.read(bb) < 0) {
// truncated
break;
}
}
try (InputStream in = newInputStream(path)) { int nread = bb.position();
return read(in, (int)size); return (nread == size) ? arr : Arrays.copyOf(arr, nread);
} }
} }
...@@ -3177,4 +3159,336 @@ public final class Files { ...@@ -3177,4 +3159,336 @@ public final class Files {
} }
return path; return path;
} }
// -- Stream APIs --
/**
* Implementation of CloseableStream
*/
private static class DelegatingCloseableStream<T> extends DelegatingStream<T>
implements CloseableStream<T>
{
private final Closeable closeable;
DelegatingCloseableStream(Closeable c, Stream<T> delegate) {
super(delegate);
this.closeable = c;
}
public void close() {
try {
closeable.close();
} catch (IOException ex) {
throw new UncheckedIOException(ex);
}
}
}
/**
* Return a lazily populated {@code CloseableStream}, the elements of
* which are the entries in the directory. The listing is not recursive.
*
* <p> The elements of the stream are {@link Path} objects that are
* obtained as if by {@link Path#resolve(Path) resolving} the name of the
* directory entry against {@code dir}. Some file systems maintain special
* links to the directory itself and the directory's parent directory.
* Entries representing these links are not included.
*
* <p> The stream is <i>weakly consistent</i>. It is thread safe but does
* not freeze the directory while iterating, so it may (or may not)
* reflect updates to the directory that occur after returning from this
* method.
*
* <p> When not using the try-with-resources construct, then the stream's
* {@link CloseableStream#close close} method should be invoked after the
* operation is completed so as to free any resources held for the open
* directory. Operating on a closed stream behaves as if the end of stream
* has been reached. Due to read-ahead, one or more elements may be
* returned after the stream has been closed.
*
* <p> If an {@link IOException} is thrown when accessing the directory
* after this method has returned, it is wrapped in an {@link
* UncheckedIOException} which will be thrown from the method that caused
* the access to take place.
*
* @param dir The path to the directory
*
* @return The {@code CloseableStream} describing the content of the
* directory
*
* @throws NotDirectoryException
* if the file could not otherwise be opened because it is not
* a directory <i>(optional specific exception)</i>
* @throws IOException
* if an I/O error occurs when opening the directory
* @throws SecurityException
* In the case of the default provider, and a security manager is
* installed, the {@link SecurityManager#checkRead(String) checkRead}
* method is invoked to check read access to the directory.
*
* @see #newDirectoryStream(Path)
* @since 1.8
*/
public static CloseableStream<Path> list(Path dir) throws IOException {
DirectoryStream<Path> ds = Files.newDirectoryStream(dir);
final Iterator<Path> delegate = ds.iterator();
// Re-wrap DirectoryIteratorException to UncheckedIOException
Iterator<Path> it = new Iterator<Path>() {
public boolean hasNext() {
try {
return delegate.hasNext();
} catch (DirectoryIteratorException e) {
throw new UncheckedIOException(e.getCause());
}
}
public Path next() {
try {
return delegate.next();
} catch (DirectoryIteratorException e) {
throw new UncheckedIOException(e.getCause());
}
}
};
return new DelegatingCloseableStream<>(ds,
StreamSupport.stream(Spliterators.spliteratorUnknownSize(it,
Spliterator.DISTINCT)));
}
/**
* Return a {@code CloseableStream} that is lazily populated with {@code
* Path} by walking the file tree rooted at a given starting file. The
* file tree is traversed <em>depth-first</em>, the elements in the stream
* are {@link Path} objects that are obtained as if by {@link
* Path#resolve(Path) resolving} the relative path against {@code start}.
*
* <p> The {@code stream} walks the file tree as elements are consumed.
* The {@code CloseableStream} returned is guaranteed to have at least one
* element, the starting file itself. For each file visited, the stream
* attempts to read its {@link BasicFileAttributes}. If the file is a
* directory and can be opened successfully, entries in the directory, and
* their <em>descendants</em> will follow the directory in the stream as
* they are encountered. When all entries have been visited, then the
* directory is closed. The file tree walk then continues at the next
* <em>sibling</em> of the directory.
*
* <p> The stream is <i>weakly consistent</i>. It does not freeze the
* file tree while iterating, so it may (or may not) reflect updates to
* the file tree that occur after returned from this method.
*
* <p> By default, symbolic links are not automatically followed by this
* method. If the {@code options} parameter contains the {@link
* FileVisitOption#FOLLOW_LINKS FOLLOW_LINKS} option then symbolic links are
* followed. When following links, and the attributes of the target cannot
* be read, then this method attempts to get the {@code BasicFileAttributes}
* of the link.
*
* <p> If the {@code options} parameter contains the {@link
* FileVisitOption#FOLLOW_LINKS FOLLOW_LINKS} option then the stream keeps
* track of directories visited so that cycles can be detected. A cycle
* arises when there is an entry in a directory that is an ancestor of the
* directory. Cycle detection is done by recording the {@link
* java.nio.file.attribute.BasicFileAttributes#fileKey file-key} of directories,
* or if file keys are not available, by invoking the {@link #isSameFile
* isSameFile} method to test if a directory is the same file as an
* ancestor. When a cycle is detected it is treated as an I/O error with
* an instance of {@link FileSystemLoopException}.
*
* <p> The {@code maxDepth} parameter is the maximum number of levels of
* directories to visit. A value of {@code 0} means that only the starting
* file is visited, unless denied by the security manager. A value of
* {@link Integer#MAX_VALUE MAX_VALUE} may be used to indicate that all
* levels should be visited.
*
* <p> When a security manager is installed and it denies access to a file
* (or directory), then it is ignored and not included in the stream.
*
* <p> When not using the try-with-resources construct, then the stream's
* {@link CloseableStream#close close} method should be invoked after the
* operation is completed so as to free any resources held for the open
* directory. Operate the stream after it is closed will throw an
* {@link java.lang.IllegalStateException}.
*
* <p> If an {@link IOException} is thrown when accessing the directory
* after this method has returned, it is wrapped in an {@link
* UncheckedIOException} which will be thrown from the method that caused
* the access to take place.
*
* @param start
* the starting file
* @param maxDepth
* the maximum number of directory levels to visit
* @param options
* options to configure the traversal
*
* @return the {@link CloseableStream} of {@link Path}
*
* @throws IllegalArgumentException
* if the {@code maxDepth} parameter is negative
* @throws SecurityException
* If the security manager denies access to the starting file.
* In the case of the default provider, the {@link
* SecurityManager#checkRead(String) checkRead} method is invoked
* to check read access to the directory.
* @throws IOException
* if an I/O error is thrown when accessing the starting file.
* @since 1.8
*/
public static CloseableStream<Path> walk(Path start, int maxDepth,
FileVisitOption... options)
throws IOException
{
FileTreeIterator iterator = new FileTreeIterator(start, maxDepth, options);
return new DelegatingCloseableStream<>(iterator,
StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.DISTINCT))
.map(entry -> entry.file()));
}
/**
* Return a {@code CloseableStream} that is lazily populated with {@code
* Path} by walking the file tree rooted at a given starting file. The
* file tree is traversed <em>depth-first</em>, the elements in the stream
* are {@link Path} objects that are obtained as if by {@link
* Path#resolve(Path) resolving} the relative path against {@code start}.
*
* <p> This method works as if invoking it were equivalent to evaluating the
* expression:
* <blockquote><pre>
* walk(start, Integer.MAX_VALUE, options)
* </pre></blockquote>
* In other words, it visits all levels of the file tree.
*
* @param start
* the starting file
* @param options
* options to configure the traversal
*
* @return the {@link CloseableStream} of {@link Path}
*
* @throws SecurityException
* If the security manager denies access to the starting file.
* In the case of the default provider, the {@link
* SecurityManager#checkRead(String) checkRead} method is invoked
* to check read access to the directory.
* @throws IOException
* if an I/O error is thrown when accessing the starting file.
*
* @see #walk(Path, int, FileVisitOption...)
* @since 1.8
*/
public static CloseableStream<Path> walk(Path start,
FileVisitOption... options)
throws IOException
{
return walk(start, Integer.MAX_VALUE, options);
}
/**
* Return a {@code CloseableStream} that is lazily populated with {@code
* Path} by searching for files in a file tree rooted at a given starting
* file.
*
* <p> This method walks the file tree in exactly the manner specified by
* the {@link #walk walk} method. For each file encountered, the given
* {@link BiPredicate} is invoked with its {@link Path} and {@link
* BasicFileAttributes}. The {@code Path} object is obtained as if by
* {@link Path#resolve(Path) resolving} the relative path against {@code
* start} and is only included in the returned {@link CloseableStream} if
* the {@code BiPredicate} returns true. Compare to calling {@link
* java.util.stream.Stream#filter filter} on the {@code Stream}
* returned by {@code walk} method, this method may be more efficient by
* avoiding redundant retrieval of the {@code BasicFileAttributes}.
*
* <p> If an {@link IOException} is thrown when accessing the directory
* after returned from this method, it is wrapped in an {@link
* UncheckedIOException} which will be thrown from the method that caused
* the access to take place.
*
* @param start
* the starting file
* @param maxDepth
* the maximum number of directory levels to search
* @param matcher
* the function used to decide whether a file should be included
* in the returned stream
* @param options
* options to configure the traversal
*
* @return the {@link CloseableStream} of {@link Path}
*
* @throws IllegalArgumentException
* if the {@code maxDepth} parameter is negative
* @throws SecurityException
* If the security manager denies access to the starting file.
* In the case of the default provider, the {@link
* SecurityManager#checkRead(String) checkRead} method is invoked
* to check read access to the directory.
* @throws IOException
* if an I/O error is thrown when accessing the starting file.
*
* @see #walk(Path, int, FileVisitOption...)
* @since 1.8
*/
public static CloseableStream<Path> find(Path start,
int maxDepth,
BiPredicate<Path, BasicFileAttributes> matcher,
FileVisitOption... options)
throws IOException
{
FileTreeIterator iterator = new FileTreeIterator(start, maxDepth, options);
return new DelegatingCloseableStream<>(iterator,
StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.DISTINCT))
.filter(entry -> matcher.test(entry.file(), entry.attributes()))
.map(entry -> entry.file()));
}
/**
* Read all lines from a file as a {@code CloseableStream}. Unlike {@link
* #readAllLines(Path, Charset) readAllLines}, this method does not read
* all lines into a {@code List}, but instead populates lazily as the stream
* is consumed.
*
* <p> Bytes from the file are decoded into characters using the specified
* charset and the same line terminators as specified by {@code
* readAllLines} are supported.
*
* <p> After this method returns, then any subsequent I/O exception that
* occurs while reading from the file or when a malformed or unmappable byte
* sequence is read, is wrapped in an {@link UncheckedIOException} that will
* be thrown form the
* {@link java.util.stream.Stream} method that caused the read to take
* place. In case an {@code IOException} is thrown when closing the file,
* it is also wrapped as an {@code UncheckedIOException}.
*
* <p> When not using the try-with-resources construct, then stream's
* {@link CloseableStream#close close} method should be invoked after
* operation is completed so as to free any resources held for the open
* file.
*
* @param path
* the path to the file
* @param cs
* the charset to use for decoding
*
* @return the lines from the file as a {@code CloseableStream}
*
* @throws IOException
* if an I/O error occurs opening the file
* @throws SecurityException
* In the case of the default provider, and a security manager is
* installed, the {@link SecurityManager#checkRead(String) checkRead}
* method is invoked to check read access to the file.
*
* @see #readAllLines(Path, Charset)
* @see #newBufferedReader(Path, Charset)
* @see java.io.BufferedReader#lines()
* @since 1.8
*/
public static CloseableStream<String> lines(Path path, Charset cs)
throws IOException
{
BufferedReader br = Files.newBufferedReader(path, cs);
return new DelegatingCloseableStream<>(br, br.lines());
}
} }
...@@ -59,7 +59,7 @@ import sun.util.locale.provider.TimeZoneNameUtility; ...@@ -59,7 +59,7 @@ import sun.util.locale.provider.TimeZoneNameUtility;
* <code>DateFormatSymbols</code> is a public class for encapsulating * <code>DateFormatSymbols</code> is a public class for encapsulating
* localizable date-time formatting data, such as the names of the * localizable date-time formatting data, such as the names of the
* months, the names of the days of the week, and the time zone data. * months, the names of the days of the week, and the time zone data.
* <code>DateFormat</code> and <code>SimpleDateFormat</code> both use * <code>SimpleDateFormat</code> uses
* <code>DateFormatSymbols</code> to encapsulate this information. * <code>DateFormatSymbols</code> to encapsulate this information.
* *
* <p> * <p>
......
...@@ -86,9 +86,13 @@ class ComparableTimSort { ...@@ -86,9 +86,13 @@ class ComparableTimSort {
private static final int INITIAL_TMP_STORAGE_LENGTH = 256; private static final int INITIAL_TMP_STORAGE_LENGTH = 256;
/** /**
* Temp storage for merges. * Temp storage for merges. A workspace array may optionally be
* provided in constructor, and if so will be used as long as it
* is big enough.
*/ */
private Object[] tmp; private Object[] tmp;
private int tmpBase; // base of tmp array slice
private int tmpLen; // length of tmp array slice
/** /**
* A stack of pending runs yet to be merged. Run i starts at * A stack of pending runs yet to be merged. Run i starts at
...@@ -108,15 +112,27 @@ class ComparableTimSort { ...@@ -108,15 +112,27 @@ class ComparableTimSort {
* Creates a TimSort instance to maintain the state of an ongoing sort. * Creates a TimSort instance to maintain the state of an ongoing sort.
* *
* @param a the array to be sorted * @param a the array to be sorted
* @param work a workspace array (slice)
* @param workBase origin of usable space in work array
* @param workLen usable size of work array
*/ */
private ComparableTimSort(Object[] a) { private ComparableTimSort(Object[] a, Object[] work, int workBase, int workLen) {
this.a = a; this.a = a;
// Allocate temp storage (which may be increased later if necessary) // Allocate temp storage (which may be increased later if necessary)
int len = a.length; int len = a.length;
Object[] newArray = new Object[len < 2 * INITIAL_TMP_STORAGE_LENGTH ? int tlen = (len < 2 * INITIAL_TMP_STORAGE_LENGTH) ?
len >>> 1 : INITIAL_TMP_STORAGE_LENGTH]; len >>> 1 : INITIAL_TMP_STORAGE_LENGTH;
tmp = newArray; if (work == null || workLen < tlen || workBase + tlen > work.length) {
tmp = new Object[tlen];
tmpBase = 0;
tmpLen = tlen;
}
else {
tmp = work;
tmpBase = workBase;
tmpLen = workLen;
}
/* /*
* Allocate runs-to-be-merged stack (which cannot be expanded). The * Allocate runs-to-be-merged stack (which cannot be expanded). The
...@@ -136,17 +152,28 @@ class ComparableTimSort { ...@@ -136,17 +152,28 @@ class ComparableTimSort {
} }
/* /*
* The next two methods (which are package private and static) constitute * The next method (package private and static) constitutes the
* the entire API of this class. Each of these methods obeys the contract * entire API of this class.
* of the public method with the same signature in java.util.Arrays.
*/ */
static void sort(Object[] a) { /**
sort(a, 0, a.length); * Sorts the given range, using the given workspace array slice
} * for temp storage when possible. This method is designed to be
* invoked from public methods (in class Arrays) after performing
* any necessary array bounds checks and expanding parameters into
* the required forms.
*
* @param a the array to be sorted
* @param lo the index of the first element, inclusive, to be sorted
* @param hi the index of the last element, exclusive, to be sorted
* @param work a workspace array (slice)
* @param workBase origin of usable space in work array
* @param workLen usable size of work array
* @since 1.8
*/
static void sort(Object[] a, int lo, int hi, Object[] work, int workBase, int workLen) {
assert a != null && lo >= 0 && lo <= hi && hi <= a.length;
static void sort(Object[] a, int lo, int hi) {
rangeCheck(a.length, lo, hi);
int nRemaining = hi - lo; int nRemaining = hi - lo;
if (nRemaining < 2) if (nRemaining < 2)
return; // Arrays of size 0 and 1 are always sorted return; // Arrays of size 0 and 1 are always sorted
...@@ -163,7 +190,7 @@ class ComparableTimSort { ...@@ -163,7 +190,7 @@ class ComparableTimSort {
* extending short natural runs to minRun elements, and merging runs * extending short natural runs to minRun elements, and merging runs
* to maintain stack invariant. * to maintain stack invariant.
*/ */
ComparableTimSort ts = new ComparableTimSort(a); ComparableTimSort ts = new ComparableTimSort(a, work, workBase, workLen);
int minRun = minRunLength(nRemaining); int minRun = minRunLength(nRemaining);
do { do {
// Identify next run // Identify next run
...@@ -619,11 +646,11 @@ class ComparableTimSort { ...@@ -619,11 +646,11 @@ class ComparableTimSort {
// Copy first run into temp array // Copy first run into temp array
Object[] a = this.a; // For performance Object[] a = this.a; // For performance
Object[] tmp = ensureCapacity(len1); Object[] tmp = ensureCapacity(len1);
System.arraycopy(a, base1, tmp, 0, len1);
int cursor1 = 0; // Indexes into tmp array int cursor1 = tmpBase; // Indexes into tmp array
int cursor2 = base2; // Indexes int a int cursor2 = base2; // Indexes int a
int dest = base1; // Indexes int a int dest = base1; // Indexes int a
System.arraycopy(a, base1, tmp, cursor1, len1);
// Move first element of second run and deal with degenerate cases // Move first element of second run and deal with degenerate cases
a[dest++] = a[cursor2++]; a[dest++] = a[cursor2++];
...@@ -736,16 +763,17 @@ class ComparableTimSort { ...@@ -736,16 +763,17 @@ class ComparableTimSort {
// Copy second run into temp array // Copy second run into temp array
Object[] a = this.a; // For performance Object[] a = this.a; // For performance
Object[] tmp = ensureCapacity(len2); Object[] tmp = ensureCapacity(len2);
System.arraycopy(a, base2, tmp, 0, len2); int tmpBase = this.tmpBase;
System.arraycopy(a, base2, tmp, tmpBase, len2);
int cursor1 = base1 + len1 - 1; // Indexes into a int cursor1 = base1 + len1 - 1; // Indexes into a
int cursor2 = len2 - 1; // Indexes into tmp array int cursor2 = tmpBase + len2 - 1; // Indexes into tmp array
int dest = base2 + len2 - 1; // Indexes into a int dest = base2 + len2 - 1; // Indexes into a
// Move last element of first run and deal with degenerate cases // Move last element of first run and deal with degenerate cases
a[dest--] = a[cursor1--]; a[dest--] = a[cursor1--];
if (--len1 == 0) { if (--len1 == 0) {
System.arraycopy(tmp, 0, a, dest - (len2 - 1), len2); System.arraycopy(tmp, tmpBase, a, dest - (len2 - 1), len2);
return; return;
} }
if (len2 == 1) { if (len2 == 1) {
...@@ -803,7 +831,7 @@ class ComparableTimSort { ...@@ -803,7 +831,7 @@ class ComparableTimSort {
if (--len2 == 1) if (--len2 == 1)
break outer; break outer;
count2 = len2 - gallopLeft((Comparable) a[cursor1], tmp, 0, len2, len2 - 1); count2 = len2 - gallopLeft((Comparable) a[cursor1], tmp, tmpBase, len2, len2 - 1);
if (count2 != 0) { if (count2 != 0) {
dest -= count2; dest -= count2;
cursor2 -= count2; cursor2 -= count2;
...@@ -835,7 +863,7 @@ class ComparableTimSort { ...@@ -835,7 +863,7 @@ class ComparableTimSort {
} else { } else {
assert len1 == 0; assert len1 == 0;
assert len2 > 0; assert len2 > 0;
System.arraycopy(tmp, 0, a, dest - (len2 - 1), len2); System.arraycopy(tmp, tmpBase, a, dest - (len2 - 1), len2);
} }
} }
...@@ -848,7 +876,7 @@ class ComparableTimSort { ...@@ -848,7 +876,7 @@ class ComparableTimSort {
* @return tmp, whether or not it grew * @return tmp, whether or not it grew
*/ */
private Object[] ensureCapacity(int minCapacity) { private Object[] ensureCapacity(int minCapacity) {
if (tmp.length < minCapacity) { if (tmpLen < minCapacity) {
// Compute smallest power of 2 > minCapacity // Compute smallest power of 2 > minCapacity
int newSize = minCapacity; int newSize = minCapacity;
newSize |= newSize >> 1; newSize |= newSize >> 1;
...@@ -863,30 +891,13 @@ class ComparableTimSort { ...@@ -863,30 +891,13 @@ class ComparableTimSort {
else else
newSize = Math.min(newSize, a.length >>> 1); newSize = Math.min(newSize, a.length >>> 1);
@SuppressWarnings({"unchecked", "UnnecessaryLocalVariable"})
Object[] newArray = new Object[newSize]; Object[] newArray = new Object[newSize];
tmp = newArray; tmp = newArray;
tmpLen = newSize;
tmpBase = 0;
} }
return tmp; return tmp;
} }
/**
* Checks that fromIndex and toIndex are in range, and throws an
* appropriate exception if they aren't.
*
* @param arrayLen the length of the array
* @param fromIndex the index of the first element of the range
* @param toIndex the index after the last element of the range
* @throws IllegalArgumentException if fromIndex > toIndex
* @throws ArrayIndexOutOfBoundsException if fromIndex < 0
* or toIndex > arrayLen
*/
private static void rangeCheck(int arrayLen, int fromIndex, int toIndex) {
if (fromIndex > toIndex)
throw new IllegalArgumentException("fromIndex(" + fromIndex +
") > toIndex(" + toIndex+")");
if (fromIndex < 0)
throw new ArrayIndexOutOfBoundsException(fromIndex);
if (toIndex > arrayLen)
throw new ArrayIndexOutOfBoundsException(toIndex);
}
} }
...@@ -89,7 +89,7 @@ import sun.util.ResourceBundleEnumeration; ...@@ -89,7 +89,7 @@ import sun.util.ResourceBundleEnumeration;
* *
* public class MyResources_fr extends ListResourceBundle { * public class MyResources_fr extends ListResourceBundle {
* protected Object[][] getContents() { * protected Object[][] getContents() {
* return new Object[][] = { * return new Object[][] {
* // LOCALIZE THIS * // LOCALIZE THIS
* {"s1", "Le disque \"{1}\" {0}."}, // MessageFormat pattern * {"s1", "Le disque \"{1}\" {0}."}, // MessageFormat pattern
* {"s2", "1"}, // location of {0} in pattern * {"s2", "1"}, // location of {0} in pattern
......
...@@ -124,6 +124,8 @@ public class PropertyResourceBundle extends ResourceBundle { ...@@ -124,6 +124,8 @@ public class PropertyResourceBundle extends ResourceBundle {
* to read from. * to read from.
* @throws IOException if an I/O error occurs * @throws IOException if an I/O error occurs
* @throws NullPointerException if <code>stream</code> is null * @throws NullPointerException if <code>stream</code> is null
* @throws IllegalArgumentException if {@code stream} contains a
* malformed Unicode escape sequence.
*/ */
@SuppressWarnings({"unchecked", "rawtypes"}) @SuppressWarnings({"unchecked", "rawtypes"})
public PropertyResourceBundle (InputStream stream) throws IOException { public PropertyResourceBundle (InputStream stream) throws IOException {
...@@ -142,6 +144,8 @@ public class PropertyResourceBundle extends ResourceBundle { ...@@ -142,6 +144,8 @@ public class PropertyResourceBundle extends ResourceBundle {
* read from. * read from.
* @throws IOException if an I/O error occurs * @throws IOException if an I/O error occurs
* @throws NullPointerException if <code>reader</code> is null * @throws NullPointerException if <code>reader</code> is null
* @throws IllegalArgumentException if a malformed Unicode escape sequence appears
* from {@code reader}.
* @since 1.6 * @since 1.6
*/ */
@SuppressWarnings({"unchecked", "rawtypes"}) @SuppressWarnings({"unchecked", "rawtypes"})
......
...@@ -24,14 +24,16 @@ ...@@ -24,14 +24,16 @@
*/ */
package java.util.function; package java.util.function;
import java.util.Objects;
/** /**
* An operation which accepts two input arguments and returns no result. This is * An operation which accepts two input arguments and returns no result. This is
* the two-arity specialization of {@link Consumer}. Unlike most other * the two-arity specialization of {@link Consumer}. Unlike most other
* functional interfaces, {@code BiConsumer} is expected to operate via * functional interfaces, {@code BiConsumer} is expected to operate via
* side-effects. * side-effects.
* *
* @param <T> the type of the first argument to the {@code accept} operation. * @param <T> the type of the first argument to the {@code accept} operation
* @param <U> the type of the second argument to the {@code accept} operation. * @param <U> the type of the second argument to the {@code accept} operation
* *
* @see Consumer * @see Consumer
* @since 1.8 * @since 1.8
...@@ -47,4 +49,28 @@ public interface BiConsumer<T, U> { ...@@ -47,4 +49,28 @@ public interface BiConsumer<T, U> {
* @param u an input object * @param u an input object
*/ */
void accept(T t, U u); void accept(T t, U u);
/**
* Returns a {@code BiConsumer} which performs, in sequence, the operation
* represented by this object followed by the operation represented by
* the other {@code BiConsumer}.
*
* <p>Any exceptions thrown by either {@code accept} method are relayed
* to the caller; if performing this operation throws an exception, the
* other operation will not be performed.
*
* @param other a BiConsumer which will be chained after this BiConsumer
* @return a BiConsumer which performs in sequence the {@code accept} method
* of this BiConsumer and the {@code accept} method of the specified
* BiConsumer operation
* @throws NullPointerException if other is null
*/
default BiConsumer<T, U> chain(BiConsumer<? super T, ? super U> other) {
Objects.requireNonNull(other);
return (l, r) -> {
accept(l, r);
other.accept(l, r);
};
}
} }
...@@ -24,15 +24,17 @@ ...@@ -24,15 +24,17 @@
*/ */
package java.util.function; package java.util.function;
import java.util.Objects;
/** /**
* Apply a function to the input arguments, yielding an appropriate result. This * Apply a function to the input arguments, yielding an appropriate result. This
* is the two-arity specialization of {@link Function}. A function may * is the two-arity specialization of {@link Function}. A function may
* variously provide a mapping between types, object instances or keys and * variously provide a mapping between types, object instances or keys and
* values or any other form of transformation upon the input. * values or any other form of transformation upon the input.
* *
* @param <T> the type of the first argument to the {@code apply} operation. * @param <T> the type of the first argument to the {@code apply} operation
* @param <U> the type of the second argument to the {@code apply} operation. * @param <U> the type of the second argument to the {@code apply} operation
* @param <R> the type of results returned by the {@code apply} operation. * @param <R> the type of results returned by the {@code apply} operation
* *
* @see Function * @see Function
* @since 1.8 * @since 1.8
...@@ -48,4 +50,22 @@ public interface BiFunction<T, U, R> { ...@@ -48,4 +50,22 @@ public interface BiFunction<T, U, R> {
* @return the function result * @return the function result
*/ */
R apply(T t, U u); R apply(T t, U u);
/**
* Returns a new function which applies this function followed by the
* provided function. If either function throws an exception, it is relayed
* to the caller.
*
* @param <V> Type of output objects to the combined function. May be the
* same type as {@code <T>}, {@code <U>} or {@code <R>}
* @param after An additional function to be applied after this function is
* applied
* @return A function which performs this function followed by the provided
* function
* @throws NullPointerException if after is null
*/
default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t, U u) -> after.apply(apply(t, u));
}
} }
...@@ -30,8 +30,8 @@ import java.util.Objects; ...@@ -30,8 +30,8 @@ import java.util.Objects;
* Determines if the input objects match some criteria. This is the two-arity * Determines if the input objects match some criteria. This is the two-arity
* specialization of {@link Predicate}. * specialization of {@link Predicate}.
* *
* @param <T> the type of the first argument to {@code test}. * @param <T> the type of the first argument to {@code test}
* @param <U> the type of the second argument to {@code test}. * @param <U> the type of the second argument to {@code test}
* *
* @see Predicate * @see Predicate
* @since 1.8 * @since 1.8
...@@ -42,9 +42,9 @@ public interface BiPredicate<T, U> { ...@@ -42,9 +42,9 @@ public interface BiPredicate<T, U> {
/** /**
* Return {@code true} if the inputs match some criteria. * Return {@code true} if the inputs match some criteria.
* *
* @param t an input object. * @param t an input object
* @param u an input object. * @param u an input object
* @return {@code true} if the inputs match some criteria. * @return {@code true} if the inputs match some criteria
*/ */
boolean test(T t, U u); boolean test(T t, U u);
...@@ -54,11 +54,12 @@ public interface BiPredicate<T, U> { ...@@ -54,11 +54,12 @@ public interface BiPredicate<T, U> {
* this predicate returns {@code false} then the remaining predicate is not * this predicate returns {@code false} then the remaining predicate is not
* evaluated. * evaluated.
* *
* @param p a predicate which will be logically-ANDed with this predicate. * @param p a predicate which will be logically-ANDed with this predicate
* @return a new predicate which returns {@code true} only if both * @return a new predicate which returns {@code true} only if both
* predicates return {@code true}. * predicates return {@code true}
* @throws NullPointerException if p is null
*/ */
public default BiPredicate<T, U> and(BiPredicate<? super T, ? super U> p) { default BiPredicate<T, U> and(BiPredicate<? super T, ? super U> p) {
Objects.requireNonNull(p); Objects.requireNonNull(p);
return (T t, U u) -> test(t, u) && p.test(t, u); return (T t, U u) -> test(t, u) && p.test(t, u);
} }
...@@ -67,9 +68,9 @@ public interface BiPredicate<T, U> { ...@@ -67,9 +68,9 @@ public interface BiPredicate<T, U> {
* Returns a predicate which negates the result of this predicate. * Returns a predicate which negates the result of this predicate.
* *
* @return a new predicate who's result is always the opposite of this * @return a new predicate who's result is always the opposite of this
* predicate. * predicate
*/ */
public default BiPredicate<T, U> negate() { default BiPredicate<T, U> negate() {
return (T t, U u) -> !test(t, u); return (T t, U u) -> !test(t, u);
} }
...@@ -79,25 +80,13 @@ public interface BiPredicate<T, U> { ...@@ -79,25 +80,13 @@ public interface BiPredicate<T, U> {
* predicate returns {@code true} then the remaining predicate is not * predicate returns {@code true} then the remaining predicate is not
* evaluated. * evaluated.
* *
* @param p a predicate which will be logically-ORed with this predicate. * @param p a predicate which will be logically-ORed with this predicate
* @return a new predicate which returns {@code true} if either predicate * @return a new predicate which returns {@code true} if either predicate
* returns {@code true}. * returns {@code true}
* @throws NullPointerException if p is null
*/ */
public default BiPredicate<T, U> or(BiPredicate<? super T, ? super U> p) { default BiPredicate<T, U> or(BiPredicate<? super T, ? super U> p) {
Objects.requireNonNull(p); Objects.requireNonNull(p);
return (T t, U u) -> test(t, u) || p.test(t, u); return (T t, U u) -> test(t, u) || p.test(t, u);
} }
/**
* Returns a predicate that evaluates to {@code true} if both or neither of
* the component predicates evaluate to {@code true}.
*
* @param p a predicate which will be logically-XORed with this predicate.
* @return a predicate that evaluates to {@code true} if both or neither of
* the component predicates evaluate to {@code true}.
*/
public default BiPredicate<T, U> xor(BiPredicate<? super T, ? super U> p) {
Objects.requireNonNull(p);
return (T t, U u) -> test(t, u) ^ p.test(t, u);
}
} }
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册