This commit is contained in:
Phil Race 2015-10-12 14:44:02 -07:00
commit 3e4d70d3d4
78 changed files with 8829 additions and 7559 deletions
.hgtags.hgtags-top-repo
common/autoconf
corba
hotspot
.hgtags
test
compiler/classUnloading/anonymousClass
runtime/8003720
jaxp
jaxws
jdk
.hgtags
src
java.base/share/classes
java.desktop/share/classes/sun/applet
java.naming/share/classes/com/sun/jndi/ldap
java.security.jgss/share/classes/sun/security/krb5/internal
jdk.crypto.pkcs11/share/classes/sun/security/pkcs11
test
langtools
.hgtags
src/jdk.compiler/share/classes/com/sun/tools/javac/comp
test/tools/javac
make
nashorn
.hgtags
src/jdk.scripting.nashorn/share/classes/jdk
internal/dynalink
nashorn/internal
test/script/basic

@ -327,3 +327,4 @@ c8753d0be1778944dc512ec86a459941ea1ad2c3 jdk9-b78
6521875cb63e1d0121b30af56ebbc36db078c4c6 jdk9-b82 6521875cb63e1d0121b30af56ebbc36db078c4c6 jdk9-b82
f61a63b7d1e52e307abc0bfc751203155d362ec4 jdk9-b83 f61a63b7d1e52e307abc0bfc751203155d362ec4 jdk9-b83
51b2db2fa04c16d767b66113dbf08c5349ce382a jdk9-b84 51b2db2fa04c16d767b66113dbf08c5349ce382a jdk9-b84
8392405ab038b22e69a3728e17dbdd9e3d3a22ed jdk9-b85

@ -327,3 +327,4 @@ b8afcf91331d78626a583ec1b63164468d6f4181 jdk9-b81
42b56d1f418523ecb61a49d7493302c80c8009cc jdk9-b82 42b56d1f418523ecb61a49d7493302c80c8009cc jdk9-b82
ce5c14d97d95084504c32b9320cb33cce4235588 jdk9-b83 ce5c14d97d95084504c32b9320cb33cce4235588 jdk9-b83
1c8134475511ffe6726677e1418a89a7a45e92d6 jdk9-b84 1c8134475511ffe6726677e1418a89a7a45e92d6 jdk9-b84
1f345217c9bab05f192d00cf1665b3286c49ccdb jdk9-b85

@ -288,7 +288,7 @@ AC_DEFUN([BASIC_SETUP_TOOL],
# Publish this variable in the help. # Publish this variable in the help.
AC_ARG_VAR($1, [Override default value for $1]) AC_ARG_VAR($1, [Override default value for $1])
if test "x[$]$1" = x; then if [[ -z "${$1+x}" ]]; then
# The variable is not set by user, try to locate tool using the code snippet # The variable is not set by user, try to locate tool using the code snippet
$2 $2
else else
@ -312,25 +312,32 @@ AC_DEFUN([BASIC_SETUP_TOOL],
# for unknown variables in the end. # for unknown variables in the end.
CONFIGURE_OVERRIDDEN_VARIABLES="$try_remove_var" CONFIGURE_OVERRIDDEN_VARIABLES="$try_remove_var"
# Check if the provided tool contains a complete path. # Check if we try to supply an empty value
tool_specified="[$]$1" if test "x[$]$1" = x; then
tool_basename="${tool_specified##*/}" AC_MSG_NOTICE([Setting user supplied tool $1= (no value)])
if test "x$tool_basename" = "x$tool_specified"; then
# A command without a complete path is provided, search $PATH.
AC_MSG_NOTICE([Will search for user supplied tool $1=$tool_basename])
AC_PATH_PROG($1, $tool_basename)
if test "x[$]$1" = x; then
AC_MSG_ERROR([User supplied tool $tool_basename could not be found])
fi
else
# Otherwise we believe it is a complete path. Use it as it is.
AC_MSG_NOTICE([Will use user supplied tool $1=$tool_specified])
AC_MSG_CHECKING([for $1]) AC_MSG_CHECKING([for $1])
if test ! -x "$tool_specified"; then AC_MSG_RESULT([disabled])
AC_MSG_RESULT([not found]) else
AC_MSG_ERROR([User supplied tool $1=$tool_specified does not exist or is not executable]) # Check if the provided tool contains a complete path.
tool_specified="[$]$1"
tool_basename="${tool_specified##*/}"
if test "x$tool_basename" = "x$tool_specified"; then
# A command without a complete path is provided, search $PATH.
AC_MSG_NOTICE([Will search for user supplied tool $1=$tool_basename])
AC_PATH_PROG($1, $tool_basename)
if test "x[$]$1" = x; then
AC_MSG_ERROR([User supplied tool $tool_basename could not be found])
fi
else
# Otherwise we believe it is a complete path. Use it as it is.
AC_MSG_NOTICE([Will use user supplied tool $1=$tool_specified])
AC_MSG_CHECKING([for $1])
if test ! -x "$tool_specified"; then
AC_MSG_RESULT([not found])
AC_MSG_ERROR([User supplied tool $1=$tool_specified does not exist or is not executable])
fi
AC_MSG_RESULT([$tool_specified])
fi fi
AC_MSG_RESULT([$tool_specified])
fi fi
fi fi
fi fi
@ -376,9 +383,7 @@ AC_DEFUN_ONCE([BASIC_SETUP_FUNDAMENTAL_TOOLS],
[ [
# Start with tools that do not need have cross compilation support # Start with tools that do not need have cross compilation support
# and can be expected to be found in the default PATH. These tools are # and can be expected to be found in the default PATH. These tools are
# used by configure. Nor are these tools expected to be found in the # used by configure.
# devkit from the builddeps server either, since they are
# needed to download the devkit.
# First are all the simple required tools. # First are all the simple required tools.
BASIC_REQUIRE_PROGS(BASENAME, basename) BASIC_REQUIRE_PROGS(BASENAME, basename)
@ -437,6 +442,7 @@ AC_DEFUN_ONCE([BASIC_SETUP_FUNDAMENTAL_TOOLS],
BASIC_PATH_PROGS(READLINK, [greadlink readlink]) BASIC_PATH_PROGS(READLINK, [greadlink readlink])
BASIC_PATH_PROGS(DF, df) BASIC_PATH_PROGS(DF, df)
BASIC_PATH_PROGS(CPIO, [cpio bsdcpio]) BASIC_PATH_PROGS(CPIO, [cpio bsdcpio])
BASIC_PATH_PROGS(NICE, nice)
]) ])
# Setup basic configuration paths, and platform-specific stuff related to PATHs. # Setup basic configuration paths, and platform-specific stuff related to PATHs.

@ -108,12 +108,6 @@ AC_DEFUN([BOOTJDK_CHECK_ARGUMENTS],
fi fi
]) ])
# Test: Is bootjdk available from builddeps?
AC_DEFUN([BOOTJDK_CHECK_BUILDDEPS],
[
BDEPS_CHECK_MODULE(BOOT_JDK, bootjdk, xxx, [BOOT_JDK_FOUND=maybe], [BOOT_JDK_FOUND=no])
])
# Test: Is $JAVA_HOME set? # Test: Is $JAVA_HOME set?
AC_DEFUN([BOOTJDK_CHECK_JAVA_HOME], AC_DEFUN([BOOTJDK_CHECK_JAVA_HOME],
[ [
@ -276,9 +270,6 @@ AC_DEFUN_ONCE([BOOTJDK_SETUP_BOOT_JDK],
AC_MSG_ERROR([The path given by --with-boot-jdk does not contain a valid Boot JDK]) AC_MSG_ERROR([The path given by --with-boot-jdk does not contain a valid Boot JDK])
fi fi
# Test: Is bootjdk available from builddeps?
BOOTJDK_DO_CHECK([BOOTJDK_CHECK_BUILDDEPS])
# Test: On MacOS X, can we find a boot jdk using /usr/libexec/java_home? # Test: On MacOS X, can we find a boot jdk using /usr/libexec/java_home?
BOOTJDK_DO_CHECK([BOOTJDK_CHECK_MACOSX_JAVA_LOCATOR]) BOOTJDK_DO_CHECK([BOOTJDK_CHECK_MACOSX_JAVA_LOCATOR])

@ -1,66 +0,0 @@
#
# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
# This is a configuration example using builddeps
# that are downloaded from an ftp server.
# This is how you use it:
#configure --with-builddeps-server=ftp://builddeps.server/adir \
# --with-builddeps-conf=..../builddeps.conf.example
# --with-builddeps-dir=/localdisk/mybuilddeps
# Translate a configuration triplet/quadruplet into something
# known by this configuration file.
# If no rewrite was found, then rewritten_target=${OPENJDK_TARGET_AUTOCONF_NAME}
REWRITE_i686_pc_linux_gnu=i686-unknown-linux-gnu
REWRITE_i386_pc_solaris2_10=i686-sun-solaris2_10
# The needed cups builddeps are platform independent header files.
# I.e. they need not be part of the devkit.
builddep_cups=lib/cups_1_3_9.zip
builddep_cups_CFLAGS=-I${depdir}
# The devkit is the cross compiler tools and sys-roots
# for the build platform.
builddep_devkit=sdk/sdk-${rewritten_build}-20110921.tar.gz
# The freetype dependency is partly platform dependent.
# It is stored inside the sys-root.
builddep_freetype2=sdk/sdk-${rewritten_build}-20110921.tar.gz
builddep_freetype2_CFLAGS=-I${depdir}/${rewritten_target}/sys-root/usr/include/freetype2
builddep_freetype2_LIBS=-lfreetype
# There are many other build dependencies, but they are implicitly
# found inside the devkit sys-root.
# The boot jdk runs on the build system and is used to compile and run
# Java build tools and of course, the bootstrap javac.
builddep_bootjdk_BUILD_i386_pc_solaris2=java/jdk-7u2-fcs-bin-b13-solaris-i586-17_nov_2011.zip
builddep_bootjdk_BUILD_x86_64_pc_solaris2=java/jdk-7u2-fcs-bin-b13-solaris-x64-17_nov_2011.zip
builddep_bootjdk_BUILD_i686_unknown_linux_gnu=java/jdk-7u2-fcs-bin-b13-linux-i586-17_nov_2011.zip
builddep_bootjdk_BUILD_x86_64_unknown_linux_gnu=java/jdk-7u2-fcs-bin-b13-linux-x64-17_nov_2011.zip
builddep_bootjdk_BUILD_sparc_solaris2=java/jdk-7u2-fcs-bin-b13-solaris-sparc-17_nov_2011.zip
builddep_bootjdk_BUILD_sparcv9_solaris2=java/jdk-7u2-fcs-bin-b13-solaris-sparcv9-17_nov_2011.zip
builddep_bootjdk_BUILD_i386_pc_windows=java/jdk-7u2-fcs-bin-b13-windows-i586-17_nov_2011.zip
builddep_bootjdk_BUILD_x86_64_pc_windows=java/jdk-7u2-fcs-bin-b13-windows-x64-17_nov_2011.zip
builddep_bootjdk_ROOT=${depdir}/jdk7_02/jdk1.7.0_02

@ -1,43 +0,0 @@
#
# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
# This is a configuration example using an nfs-mount /java
# it will use the builddeps directly from the nfs mounted directory.
# This is how you use it:
#configure --with-builddeps-conf=..../builddeps.conf.nfs.example
REWRITE_i686_pc_linux_gnu=i686-unknown-linux-gnu
REWRITE_i386_pc_solaris2_10=i686-sun-solaris2_10
DEVTOOLS=/java/devtools
builddep_cups=${DEVTOOLS}/linux/cups/include
builddep_cups_CFLAGS=-I${depdir}
JDK_ROOT=/java/re/jdk/7u4/latest/binaries
builddep_bootjdk_BUILD_i386_pc_solaris2=${JDK_ROOT}/solaris-i586
builddep_bootjdk_BUILD_x86_64_pc_solaris2=${JDK_ROOT}/solaris-amd64
builddep_bootjdk_BUILD_i686_unknown_linux_gnu=${JDK_ROOT}/linux-i586
builddep_bootjdk_BUILD_x86_64_unknown_linux_gnu=${JDK_ROOT}/linux-amd64
builddep_bootjdk_ROOT=

@ -1,247 +0,0 @@
#
# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
AC_DEFUN_ONCE([BDEPS_SCAN_FOR_BUILDDEPS],
[
define(LIST_OF_BUILD_DEPENDENCIES,)
if test "x$with_builddeps_server" != x || test "x$with_builddeps_conf" != x; then
if test "x$with_builddeps_conf" != x; then
AC_MSG_CHECKING([for supplied builddeps configuration file])
builddepsfile=$with_builddeps_conf
if test -s $builddepsfile; then
. $builddepsfile
AC_MSG_RESULT([loaded!])
else
AC_MSG_ERROR([The given builddeps conf file $with_builddeps_conf could not be loaded!])
fi
else
AC_MSG_CHECKING([for builddeps.conf files in sources...])
builddepsfile=`mktemp`
touch $builddepsfile
# Put all found confs into a single file.
find ${SRC_ROOT} -name builddeps.conf -exec cat \{\} \; >> $builddepsfile
# Source the file to acquire the variables
if test -s $builddepsfile; then
. $builddepsfile
AC_MSG_RESULT([found at least one!])
else
AC_MSG_ERROR([Could not find any builddeps.conf at all!])
fi
fi
# Create build and target names that use _ instead of "-" and ".".
# This is necessary to use them in variable names.
build_var=`echo ${OPENJDK_BUILD_AUTOCONF_NAME} | tr '-' '_' | tr '.' '_'`
target_var=`echo ${OPENJDK_TARGET_AUTOCONF_NAME} | tr '-' '_' | tr '.' '_'`
# Extract rewrite information for build and target
eval rewritten_build=\${REWRITE_${build_var}}
if test "x$rewritten_build" = x; then
rewritten_build=${OPENJDK_BUILD_AUTOCONF_NAME}
echo Build stays the same $rewritten_build
else
echo Rewriting build for builddeps into $rewritten_build
fi
eval rewritten_target=\${REWRITE_${target_var}}
if test "x$rewritten_target" = x; then
rewritten_target=${OPENJDK_TARGET_AUTOCONF_NAME}
echo Target stays the same $rewritten_target
else
echo Rewriting target for builddeps into $rewritten_target
fi
rewritten_build_var=`echo ${rewritten_build} | tr '-' '_' | tr '.' '_'`
rewritten_target_var=`echo ${rewritten_target} | tr '-' '_' | tr '.' '_'`
fi
AC_CHECK_PROGS(BDEPS_UNZIP, [7z unzip])
if test "x$BDEPS_UNZIP" = x7z; then
BDEPS_UNZIP="7z x"
fi
AC_CHECK_PROGS(BDEPS_FTP, [wget lftp ftp])
])
AC_DEFUN([BDEPS_FTPGET],
[
# $1 is the ftp://abuilddeps.server.com/libs/cups.zip
# $2 is the local file name for the downloaded file.
VALID_TOOL=no
if test "x$BDEPS_FTP" = xwget; then
VALID_TOOL=yes
wget -O $2 $1
fi
if test "x$BDEPS_FTP" = xlftp; then
VALID_TOOL=yes
lftp -c "get $1 -o $2"
fi
if test "x$BDEPS_FTP" = xftp; then
VALID_TOOL=yes
FTPSERVER=`echo $1 | cut -f 3 -d '/'`
FTPPATH=`echo $1 | cut -f 4- -d '/'`
FTPUSERPWD=${FTPSERVER%%@*}
if test "x$FTPSERVER" != "x$FTPUSERPWD"; then
FTPUSER=${userpwd%%:*}
FTPPWD=${userpwd#*@}
FTPSERVER=${FTPSERVER#*@}
else
FTPUSER=ftp
FTPPWD=ftp
fi
# the "pass" command does not work on some
# ftp clients (read ftp.exe) but if it works,
# passive mode is better!
( \
echo "user $FTPUSER $FTPPWD" ; \
echo "pass" ; \
echo "bin" ; \
echo "get $FTPPATH $2" ; \
) | ftp -in $FTPSERVER
fi
if test "x$VALID_TOOL" != xyes; then
AC_MSG_ERROR([I do not know how to use the tool: $BDEPS_FTP])
fi
])
AC_DEFUN([BDEPS_CHECK_MODULE],
[
define([LIST_OF_BUILD_DEPENDENCIES],LIST_OF_BUILD_DEPENDENCIES[$2=$3'\n'])
if test "x$with_builddeps_server" != x || test "x$with_builddeps_conf" != x; then
# Source the builddeps file again, to make sure it uses the latest variables!
. $builddepsfile
# Look for a target and build machine specific resource!
eval resource=\${builddep_$2_BUILD_${rewritten_build_var}_TARGET_${rewritten_target_var}}
if test "x$resource" = x; then
# Ok, lets instead look for a target specific resource
eval resource=\${builddep_$2_TARGET_${rewritten_target_var}}
fi
if test "x$resource" = x; then
# Ok, lets instead look for a build specific resource
eval resource=\${builddep_$2_BUILD_${rewritten_build_var}}
fi
if test "x$resource" = x; then
# Ok, lets instead look for a generic resource
# (The $2 comes from M4 and not the shell, thus no need for eval here.)
resource=${builddep_$2}
fi
if test "x$resource" != x; then
AC_MSG_NOTICE([Using builddeps $resource for $2])
# If the resource in the builddeps.conf file is an existing directory,
# for example /java/linux/cups
if test -d ${resource}; then
depdir=${resource}
else
BDEPS_FETCH($2, $resource, $with_builddeps_server, $with_builddeps_dir, depdir)
fi
# Source the builddeps file again, because in the previous command, the depdir
# was updated to point at the current build dependency install directory.
. $builddepsfile
# Now extract variables from the builddeps.conf files.
theroot=${builddep_$2_ROOT}
thecflags=${builddep_$2_CFLAGS}
thelibs=${builddep_$2_LIBS}
if test "x$depdir" = x; then
AC_MSG_ERROR([Could not download build dependency $2])
fi
$1=$depdir
if test "x$theroot" != x; then
$1="$theroot"
fi
if test "x$thecflags" != x; then
$1_CFLAGS="$thecflags"
fi
if test "x$thelibs" != x; then
$1_LIBS="$thelibs"
fi
m4_default([$4], [:])
m4_ifvaln([$5], [else $5])
fi
m4_ifvaln([$5], [else $5])
fi
])
AC_DEFUN([BDEPS_FETCH],
[
# $1 is for example mymodule
# $2 is for example libs/general/libmymod_1_2_3.zip
# $3 is for example ftp://mybuilddeps.myserver.com/builddeps
# $4 is for example /localhome/builddeps
# $5 is the name of the variable into which we store the depdir, eg MYMOD
# Will download ftp://mybuilddeps.myserver.com/builddeps/libs/general/libmymod_1_2_3.zip and
# unzip into the directory: /localhome/builddeps/libmymod_1_2_3
filename=`basename $2`
filebase=`echo $filename | sed 's/\.[[^\.]]*$//'`
filebase=${filename%%.*}
extension=${filename#*.}
installdir=$4/$filebase
if test ! -f $installdir/$filename.unpacked; then
AC_MSG_NOTICE([Downloading build dependency $1 from $3/$2 and installing into $installdir])
if test ! -d $installdir; then
mkdir -p $installdir
fi
if test ! -d $installdir; then
AC_MSG_ERROR([Could not create directory $installdir])
fi
tmpfile=`mktemp $installdir/$1.XXXXXXXXX`
touch $tmpfile
if test ! -f $tmpfile; then
AC_MSG_ERROR([Could not create files in directory $installdir])
fi
BDEPS_FTPGET([$3/$2] , [$tmpfile])
mv $tmpfile $installdir/$filename
if test ! -s $installdir/$filename; then
AC_MSG_ERROR([Could not download $3/$2])
fi
case "$extension" in
zip) echo "Unzipping $installdir/$filename..."
(cd $installdir ; rm -f $installdir/$filename.unpacked ; $BDEPS_UNZIP $installdir/$filename > /dev/null && touch $installdir/$filename.unpacked)
;;
tar.gz) echo "Untaring $installdir/$filename..."
(cd $installdir ; rm -f $installdir/$filename.unpacked ; tar xzf $installdir/$filename && touch $installdir/$filename.unpacked)
;;
tgz) echo "Untaring $installdir/$filename..."
(cd $installdir ; rm -f $installdir/$filename.unpacked ; tar xzf $installdir/$filename && touch $installdir/$filename.unpacked)
;;
*) AC_MSG_ERROR([Cannot handle build depency archive with extension $extension])
;;
esac
fi
if test -f $installdir/$filename.unpacked; then
$5=$installdir
fi
])
AC_DEFUN_ONCE([BDEPS_CONFIGURE_BUILDDEPS],
[
AC_ARG_WITH(builddeps-conf, [AS_HELP_STRING([--with-builddeps-conf],
[use this configuration file for the builddeps])])
AC_ARG_WITH(builddeps-server, [AS_HELP_STRING([--with-builddeps-server],
[download and use build dependencies from this server url])])
AC_ARG_WITH(builddeps-dir, [AS_HELP_STRING([--with-builddeps-dir],
[store downloaded build dependencies here @<:@/localhome/builddeps@:>@])],
[],
[with_builddeps_dir=/localhome/builddeps])
AC_ARG_WITH(builddeps-group, [AS_HELP_STRING([--with-builddeps-group],
[chgrp the downloaded build dependencies to this group])])
])

@ -39,7 +39,6 @@ m4_include([build-aux/pkg.m4])
# Include these first... # Include these first...
m4_include([basics.m4]) m4_include([basics.m4])
m4_include([basics_windows.m4]) m4_include([basics_windows.m4])
m4_include([builddeps.m4])
# ... then the rest # ... then the rest
m4_include([boot-jdk.m4]) m4_include([boot-jdk.m4])
m4_include([build-performance.m4]) m4_include([build-performance.m4])
@ -121,12 +120,6 @@ PKG_PROG_PKG_CONFIG
# After basic tools have been setup, we can check build os specific details. # After basic tools have been setup, we can check build os specific details.
PLATFORM_SETUP_OPENJDK_BUILD_OS_VERSION PLATFORM_SETUP_OPENJDK_BUILD_OS_VERSION
# Setup builddeps, for automatic downloading of tools we need.
# This is needed before we can call BDEPS_CHECK_MODULE, which is done in
# boot-jdk setup, but we need to have basic tools setup first.
BDEPS_CONFIGURE_BUILDDEPS
BDEPS_SCAN_FOR_BUILDDEPS
############################################################################### ###############################################################################
# #
# Determine OpenJDK variants, options and version numbers. # Determine OpenJDK variants, options and version numbers.
@ -211,14 +204,8 @@ JDKOPT_SETUP_CODE_COVERAGE
# After we have toolchain, we can compile fixpath. It's needed by the lib checks. # After we have toolchain, we can compile fixpath. It's needed by the lib checks.
BASIC_COMPILE_FIXPATH BASIC_COMPILE_FIXPATH
LIB_SETUP_INIT LIB_DETERMINE_DEPENDENCIES
LIB_SETUP_X11 LIB_SETUP_LIBRARIES
LIB_SETUP_CUPS
LIB_SETUP_FREETYPE
LIB_SETUP_ALSA
LIB_SETUP_MISC_LIBS
LIB_SETUP_STATIC_LINK_LIBSTDCPP
LIB_SETUP_ON_WINDOWS
############################################################################### ###############################################################################
# #

File diff suppressed because it is too large Load Diff

@ -1,5 +1,5 @@
# #
# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # 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
@ -31,7 +31,7 @@ AC_DEFUN_ONCE([HELP_SETUP_DEPENDENCY_HELP],
AC_DEFUN([HELP_MSG_MISSING_DEPENDENCY], AC_DEFUN([HELP_MSG_MISSING_DEPENDENCY],
[ [
# Print a helpful message on how to acquire the necessary build dependency. # Print a helpful message on how to acquire the necessary build dependency.
# $1 is the help tag: freetype, cups, pulse, alsa etc # $1 is the help tag: freetype, cups, alsa etc
MISSING_DEPENDENCY=$1 MISSING_DEPENDENCY=$1
if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then
@ -109,8 +109,8 @@ apt_help() {
PKGHANDLER_COMMAND="sudo apt-get install libcups2-dev" ;; PKGHANDLER_COMMAND="sudo apt-get install libcups2-dev" ;;
freetype) freetype)
PKGHANDLER_COMMAND="sudo apt-get install libfreetype6-dev" ;; PKGHANDLER_COMMAND="sudo apt-get install libfreetype6-dev" ;;
pulse) ffi)
PKGHANDLER_COMMAND="sudo apt-get install libpulse-dev" ;; PKGHANDLER_COMMAND="sudo apt-get install libffi-dev" ;;
x11) x11)
PKGHANDLER_COMMAND="sudo apt-get install libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev" ;; PKGHANDLER_COMMAND="sudo apt-get install libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev" ;;
ccache) ccache)
@ -130,8 +130,6 @@ yum_help() {
PKGHANDLER_COMMAND="sudo yum install cups-devel" ;; PKGHANDLER_COMMAND="sudo yum install cups-devel" ;;
freetype) freetype)
PKGHANDLER_COMMAND="sudo yum install freetype-devel" ;; PKGHANDLER_COMMAND="sudo yum install freetype-devel" ;;
pulse)
PKGHANDLER_COMMAND="sudo yum install pulseaudio-libs-devel" ;;
x11) x11)
PKGHANDLER_COMMAND="sudo yum install libXtst-devel libXt-devel libXrender-devel libXi-devel" ;; PKGHANDLER_COMMAND="sudo yum install libXtst-devel libXt-devel libXrender-devel libXi-devel" ;;
ccache) ccache)

@ -0,0 +1,90 @@
#
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# 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.
#
################################################################################
# Setup alsa (Advanced Linux Sound Architecture)
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_ALSA],
[
AC_ARG_WITH(alsa, [AS_HELP_STRING([--with-alsa],
[specify prefix directory for the alsa package
(expecting the libraries under PATH/lib and the headers under PATH/include)])])
AC_ARG_WITH(alsa-include, [AS_HELP_STRING([--with-alsa-include],
[specify directory for the alsa include files])])
AC_ARG_WITH(alsa-lib, [AS_HELP_STRING([--with-alsa-lib],
[specify directory for the alsa library])])
if test "x$NEEDS_LIB_ALSA" = xfalse; then
if test "x${with_alsa}" != x || test "x${with_alsa_include}" != x || test "x${with_alsa_lib}" != x; then
AC_MSG_WARN([alsa not used, so --with-alsa is ignored])
fi
ALSA_CFLAGS=
ALSA_LIBS=
else
ALSA_FOUND=no
if test "x${with_alsa}" = xno || test "x${with_alsa_include}" = xno || test "x${with_alsa_lib}" = xno; then
AC_MSG_ERROR([It is not possible to disable the use of alsa. Remove the --without-alsa option.])
fi
if test "x${with_alsa}" != x; then
ALSA_LIBS="-L${with_alsa}/lib -lasound"
ALSA_CFLAGS="-I${with_alsa}/include"
ALSA_FOUND=yes
fi
if test "x${with_alsa_include}" != x; then
ALSA_CFLAGS="-I${with_alsa_include}"
ALSA_FOUND=yes
fi
if test "x${with_alsa_lib}" != x; then
ALSA_LIBS="-L${with_alsa_lib} -lasound"
ALSA_FOUND=yes
fi
# Do not try pkg-config if we have a sysroot set.
if test "x$SYSROOT" = x; then
if test "x$ALSA_FOUND" = xno; then
PKG_CHECK_MODULES(ALSA, alsa, [ALSA_FOUND=yes], [ALSA_FOUND=no])
fi
fi
if test "x$ALSA_FOUND" = xno; then
AC_CHECK_HEADERS([alsa/asoundlib.h],
[
ALSA_FOUND=yes
ALSA_CFLAGS=-Iignoreme
ALSA_LIBS=-lasound
DEFAULT_ALSA=yes
],
[ALSA_FOUND=no]
)
fi
if test "x$ALSA_FOUND" = xno; then
HELP_MSG_MISSING_DEPENDENCY([alsa])
AC_MSG_ERROR([Could not find alsa! $HELP_MSG])
fi
fi
AC_SUBST(ALSA_CFLAGS)
AC_SUBST(ALSA_LIBS)
])

@ -0,0 +1,226 @@
#
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# 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.
#
################################################################################
# Setup bundled libraries.
#
# For libjpeg, giflib, libpng, lcms2 and zlib, the source is present in the
# OpenJDK repository. Default is to use these libraries as bundled, but they
# might be replaced by en external version by the user.
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_BUNDLED_LIBS],
[
LIB_SETUP_LIBJPEG
LIB_SETUP_GIFLIB
LIB_SETUP_LIBPNG
LIB_SETUP_ZLIB
LIB_SETUP_LCMS
])
################################################################################
# Setup libjpeg
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_LIBJPEG],
[
AC_ARG_WITH(libjpeg, [AS_HELP_STRING([--with-libjpeg],
[use libjpeg from build system or OpenJDK source (system, bundled) @<:@bundled@:>@])])
AC_MSG_CHECKING([for which libjpeg to use])
# default is bundled
DEFAULT_LIBJPEG=bundled
# if user didn't specify, use DEFAULT_LIBJPEG
if test "x${with_libjpeg}" = "x"; then
with_libjpeg=${DEFAULT_LIBJPEG}
fi
AC_MSG_RESULT(${with_libjpeg})
if test "x${with_libjpeg}" = "xbundled"; then
USE_EXTERNAL_LIBJPEG=false
elif test "x${with_libjpeg}" = "xsystem"; then
AC_CHECK_HEADER(jpeglib.h, [],
[ AC_MSG_ERROR([--with-libjpeg=system specified, but jpeglib.h not found!])])
AC_CHECK_LIB(jpeg, jpeg_CreateDecompress, [],
[ AC_MSG_ERROR([--with-libjpeg=system specified, but no libjpeg found])])
USE_EXTERNAL_LIBJPEG=true
else
AC_MSG_ERROR([Invalid use of --with-libjpeg: ${with_libjpeg}, use 'system' or 'bundled'])
fi
AC_SUBST(USE_EXTERNAL_LIBJPEG)
])
################################################################################
# Setup giflib
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_GIFLIB],
[
AC_ARG_WITH(giflib, [AS_HELP_STRING([--with-giflib],
[use giflib from build system or OpenJDK source (system, bundled) @<:@bundled@:>@])])
AC_MSG_CHECKING([for which giflib to use])
# default is bundled
DEFAULT_GIFLIB=bundled
# if user didn't specify, use DEFAULT_GIFLIB
if test "x${with_giflib}" = "x"; then
with_giflib=${DEFAULT_GIFLIB}
fi
AC_MSG_RESULT(${with_giflib})
if test "x${with_giflib}" = "xbundled"; then
USE_EXTERNAL_LIBGIF=false
elif test "x${with_giflib}" = "xsystem"; then
AC_CHECK_HEADER(gif_lib.h, [],
[ AC_MSG_ERROR([--with-giflib=system specified, but gif_lib.h not found!])])
AC_CHECK_LIB(gif, DGifGetCode, [],
[ AC_MSG_ERROR([--with-giflib=system specified, but no giflib found!])])
USE_EXTERNAL_LIBGIF=true
else
AC_MSG_ERROR([Invalid value of --with-giflib: ${with_giflib}, use 'system' or 'bundled'])
fi
AC_SUBST(USE_EXTERNAL_LIBGIF)
])
################################################################################
# Setup libpng
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_LIBPNG],
[
AC_ARG_WITH(libpng, [AS_HELP_STRING([--with-libpng],
[use libpng from build system or OpenJDK source (system, bundled) @<:@bundled@:>@])])
AC_MSG_CHECKING([for which libpng to use])
# default is bundled
DEFAULT_LIBPNG=bundled
# if user didn't specify, use DEFAULT_LIBPNG
if test "x${with_libpng}" = "x"; then
with_libpng=${DEFAULT_LIBPNG}
fi
if test "x${with_libpng}" = "xbundled"; then
USE_EXTERNAL_LIBPNG=false
AC_MSG_RESULT([bundled])
elif test "x${with_libpng}" = "xsystem"; then
PKG_CHECK_MODULES(PNG, libpng,
[ LIBPNG_FOUND=yes ],
[ LIBPNG_FOUND=no ])
if test "x${LIBPNG_FOUND}" = "xyes"; then
USE_EXTERNAL_LIBPNG=true
AC_MSG_RESULT([system])
else
AC_MSG_RESULT([system not found])
AC_MSG_ERROR([--with-libpng=system specified, but no libpng found!])
fi
else
AC_MSG_ERROR([Invalid value of --with-libpng: ${with_libpng}, use 'system' or 'bundled'])
fi
AC_SUBST(USE_EXTERNAL_LIBPNG)
])
################################################################################
# Setup zlib
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_ZLIB],
[
AC_ARG_WITH(zlib, [AS_HELP_STRING([--with-zlib],
[use zlib from build system or OpenJDK source (system, bundled) @<:@bundled@:>@])])
AC_CHECK_LIB(z, compress,
[ ZLIB_FOUND=yes ],
[ ZLIB_FOUND=no ])
AC_MSG_CHECKING([for which zlib to use])
DEFAULT_ZLIB=bundled
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
# On macosx default is system...on others default is bundled
DEFAULT_ZLIB=system
fi
if test "x${ZLIB_FOUND}" != "xyes"; then
# If we don't find any system...set default to bundled
DEFAULT_ZLIB=bundled
fi
# If user didn't specify, use DEFAULT_ZLIB
if test "x${with_zlib}" = "x"; then
with_zlib=${DEFAULT_ZLIB}
fi
if test "x${with_zlib}" = "xbundled"; then
USE_EXTERNAL_LIBZ=false
AC_MSG_RESULT([bundled])
elif test "x${with_zlib}" = "xsystem"; then
if test "x${ZLIB_FOUND}" = "xyes"; then
USE_EXTERNAL_LIBZ=true
AC_MSG_RESULT([system])
else
AC_MSG_RESULT([system not found])
AC_MSG_ERROR([--with-zlib=system specified, but no zlib found!])
fi
else
AC_MSG_ERROR([Invalid value for --with-zlib: ${with_zlib}, use 'system' or 'bundled'])
fi
AC_SUBST(USE_EXTERNAL_LIBZ)
])
################################################################################
# Setup lcms (Little CMS)
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_LCMS],
[
AC_ARG_WITH(lcms, [AS_HELP_STRING([--with-lcms],
[use lcms2 from build system or OpenJDK source (system, bundled) @<:@bundled@:>@])])
AC_MSG_CHECKING([for which lcms to use])
DEFAULT_LCMS=bundled
# If user didn't specify, use DEFAULT_LCMS
if test "x${with_lcms}" = "x"; then
with_lcms=${DEFAULT_LCMS}
fi
if test "x${with_lcms}" = "xbundled"; then
USE_EXTERNAL_LCMS=false
AC_MSG_RESULT([bundled])
elif test "x${with_lcms}" = "xsystem"; then
AC_MSG_RESULT([system])
PKG_CHECK_MODULES([LCMS], [lcms2], [LCMS_FOUND=yes], [LCMS_FOUND=no])
if test "x${LCMS_FOUND}" = "xyes"; then
USE_EXTERNAL_LCMS=true
else
AC_MSG_ERROR([--with-lcms=system specified, but no lcms found!])
fi
else
AC_MSG_ERROR([Invalid value for --with-lcms: ${with_lcms}, use 'system' or 'bundled'])
fi
AC_SUBST(USE_EXTERNAL_LCMS)
])

@ -0,0 +1,87 @@
#
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# 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.
#
################################################################################
# Setup cups (Common Unix Printing System)
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_CUPS],
[
AC_ARG_WITH(cups, [AS_HELP_STRING([--with-cups],
[specify prefix directory for the cups package
(expecting the headers under PATH/include)])])
AC_ARG_WITH(cups-include, [AS_HELP_STRING([--with-cups-include],
[specify directory for the cups include files])])
if test "x$NEEDS_LIB_CUPS" = xfalse; then
if test "x${with_cups}" != x || test "x${with_cups_include}" != x; then
AC_MSG_WARN([cups not used, so --with-cups is ignored])
fi
CUPS_CFLAGS=
else
CUPS_FOUND=no
if test "x${with_cups}" = xno || test "x${with_cups_include}" = xno; then
AC_MSG_ERROR([It is not possible to disable the use of cups. Remove the --without-cups option.])
fi
if test "x${with_cups}" != x; then
CUPS_CFLAGS="-I${with_cups}/include"
CUPS_FOUND=yes
fi
if test "x${with_cups_include}" != x; then
CUPS_CFLAGS="-I${with_cups_include}"
CUPS_FOUND=yes
fi
if test "x$CUPS_FOUND" = xno; then
# Are the cups headers installed in the default /usr/include location?
AC_CHECK_HEADERS([cups/cups.h cups/ppd.h], [
CUPS_FOUND=yes
CUPS_CFLAGS=
DEFAULT_CUPS=yes
])
fi
if test "x$CUPS_FOUND" = xno; then
# Getting nervous now? Lets poke around for standard Solaris third-party
# package installation locations.
AC_MSG_CHECKING([for cups headers])
if test -s $SYSROOT/opt/sfw/cups/include/cups/cups.h; then
# An SFW package seems to be installed!
CUPS_FOUND=yes
CUPS_CFLAGS="-I$SYSROOT/opt/sfw/cups/include"
elif test -s $SYSROOT/opt/csw/include/cups/cups.h; then
# A CSW package seems to be installed!
CUPS_FOUND=yes
CUPS_CFLAGS="-I$SYSROOT/opt/csw/include"
fi
AC_MSG_RESULT([$CUPS_FOUND])
fi
if test "x$CUPS_FOUND" = xno; then
HELP_MSG_MISSING_DEPENDENCY([cups])
AC_MSG_ERROR([Could not find cups! $HELP_MSG ])
fi
fi
AC_SUBST(CUPS_CFLAGS)
])

114
common/autoconf/lib-ffi.m4 Normal file

@ -0,0 +1,114 @@
#
# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation. Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#
################################################################################
# Setup libffi (Foreign Function Interface)
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_LIBFFI],
[
AC_ARG_WITH(libffi, [AS_HELP_STRING([--with-libffi],
[specify prefix directory for the libffi package
(expecting the libraries under PATH/lib and the headers under PATH/include)])])
AC_ARG_WITH(libffi-include, [AS_HELP_STRING([--with-libffi-include],
[specify directory for the libffi include files])])
AC_ARG_WITH(libffi-lib, [AS_HELP_STRING([--with-libffi-lib],
[specify directory for the libffi library])])
if test "x$NEEDS_LIB_FFI" = xfalse; then
if test "x${with_libffi}" != x || test "x${with_libffi_include}" != x || test "x${with_libffi_lib}" != x; then
AC_MSG_WARN([libffi not used, so --with-libffi is ignored])
fi
LIBFFI_CFLAGS=
LIBFFI_LIBS=
else
LIBFFI_FOUND=no
if test "x${with_libffi}" = xno || test "x${with_libffi_include}" = xno || test "x${with_libffi_lib}" = xno; then
AC_MSG_ERROR([It is not possible to disable the use of libffi. Remove the --without-libffi option.])
fi
if test "x${with_libffi}" != x; then
LIBFFI_LIBS="-L${with_libffi}/lib -lffi"
LIBFFI_CFLAGS="-I${with_libffi}/include"
LIBFFI_FOUND=yes
fi
if test "x${with_libffi_include}" != x; then
LIBFFI_CFLAGS="-I${with_libffi_include}"
LIBFFI_FOUND=yes
fi
if test "x${with_libffi_lib}" != x; then
LIBFFI_LIBS="-L${with_libffi_lib} -lffi"
LIBFFI_FOUND=yes
fi
# Do not try pkg-config if we have a sysroot set.
if test "x$SYSROOT" = x; then
if test "x$LIBFFI_FOUND" = xno; then
# Figure out LIBFFI_CFLAGS and LIBFFI_LIBS
PKG_CHECK_MODULES([LIBFFI], [libffi], [LIBFFI_FOUND=yes], [LIBFFI_FOUND=no])
fi
fi
if test "x$LIBFFI_FOUND" = xno; then
AC_CHECK_HEADERS([ffi.h],
[
LIBFFI_FOUND=yes
LIBFFI_CFLAGS=
LIBFFI_LIBS=-lffi
],
[LIBFFI_FOUND=no]
)
fi
if test "x$LIBFFI_FOUND" = xno; then
HELP_MSG_MISSING_DEPENDENCY([ffi])
AC_MSG_ERROR([Could not find libffi! $HELP_MSG])
fi
AC_MSG_CHECKING([if libffi works])
AC_LANG_PUSH(C)
OLD_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $LIBFFI_CFLAGS"
OLD_LIBS="$LIBS"
LIBS="$LIBS $LIBFFI_LIBS"
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <ffi.h>],
[
ffi_call(NULL, NULL, NULL, NULL);
return 0;
])],
[LIBFFI_WORKS=yes],
[LIBFFI_WORKS=no]
)
CFLAGS="$OLD_CFLAGS"
LIBS="$OLD_LIBS"
AC_LANG_POP(C)
AC_MSG_RESULT([$LIBFFI_WORKS])
if test "x$LIBFFI_WORKS" = xno; then
HELP_MSG_MISSING_DEPENDENCY([ffi])
AC_MSG_ERROR([Found libffi but could not link and compile with it. $HELP_MSG])
fi
fi
AC_SUBST(LIBFFI_CFLAGS)
AC_SUBST(LIBFFI_LIBS)
])

@ -0,0 +1,420 @@
#
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# 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.
#
################################################################################
# Build the freetype lib from source
################################################################################
AC_DEFUN([LIB_BUILD_FREETYPE],
[
FREETYPE_SRC_PATH="$1"
BUILD_FREETYPE=yes
# Check if the freetype sources are acessible..
if ! test -d $FREETYPE_SRC_PATH; then
AC_MSG_WARN([--with-freetype-src specified, but can not find path "$FREETYPE_SRC_PATH" - ignoring --with-freetype-src])
BUILD_FREETYPE=no
fi
# ..and contain a vc2010 project file
vcxproj_path="$FREETYPE_SRC_PATH/builds/windows/vc2010/freetype.vcxproj"
if test "x$BUILD_FREETYPE" = xyes && ! test -s $vcxproj_path; then
AC_MSG_WARN([Can not find project file $vcxproj_path (you may try a newer freetype version) - ignoring --with-freetype-src])
BUILD_FREETYPE=no
fi
# Now check if configure found a version of 'msbuild.exe'
if test "x$BUILD_FREETYPE" = xyes && test "x$MSBUILD" == x ; then
AC_MSG_WARN([Can not find an msbuild.exe executable (you may try to install .NET 4.0) - ignoring --with-freetype-src])
BUILD_FREETYPE=no
fi
# Ready to go..
if test "x$BUILD_FREETYPE" = xyes; then
# msbuild requires trailing slashes for output directories
freetype_lib_path="$FREETYPE_SRC_PATH/lib$OPENJDK_TARGET_CPU_BITS/"
freetype_lib_path_unix="$freetype_lib_path"
freetype_obj_path="$FREETYPE_SRC_PATH/obj$OPENJDK_TARGET_CPU_BITS/"
BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH(vcxproj_path)
BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH(freetype_lib_path)
BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH(freetype_obj_path)
if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then
freetype_platform=x64
else
freetype_platform=win32
fi
# The original freetype project file is for VS 2010 (i.e. 'v100'),
# so we have to adapt the toolset if building with any other toolsed (i.e. SDK).
# Currently 'PLATFORM_TOOLSET' is set in 'TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT'/
# 'TOOLCHAIN_CHECK_POSSIBLE_WIN_SDK_ROOT' in toolchain_windows.m4
AC_MSG_NOTICE([Trying to compile freetype sources with PlatformToolset=$PLATFORM_TOOLSET to $freetype_lib_path_unix ...])
# First we try to build the freetype.dll
$ECHO -e "@echo off\n"\
"$MSBUILD $vcxproj_path "\
"/p:PlatformToolset=$PLATFORM_TOOLSET "\
"/p:Configuration=\"Release Multithreaded\" "\
"/p:Platform=$freetype_platform "\
"/p:ConfigurationType=DynamicLibrary "\
"/p:TargetName=freetype "\
"/p:OutDir=\"$freetype_lib_path\" "\
"/p:IntDir=\"$freetype_obj_path\" > freetype.log" > freetype.bat
cmd /c freetype.bat
if test -s "$freetype_lib_path_unix/freetype.dll"; then
# If that succeeds we also build freetype.lib
$ECHO -e "@echo off\n"\
"$MSBUILD $vcxproj_path "\
"/p:PlatformToolset=$PLATFORM_TOOLSET "\
"/p:Configuration=\"Release Multithreaded\" "\
"/p:Platform=$freetype_platform "\
"/p:ConfigurationType=StaticLibrary "\
"/p:TargetName=freetype "\
"/p:OutDir=\"$freetype_lib_path\" "\
"/p:IntDir=\"$freetype_obj_path\" >> freetype.log" > freetype.bat
cmd /c freetype.bat
if test -s "$freetype_lib_path_unix/freetype.lib"; then
# Once we build both, lib and dll, set freetype lib and include path appropriately
POTENTIAL_FREETYPE_INCLUDE_PATH="$FREETYPE_SRC_PATH/include"
POTENTIAL_FREETYPE_LIB_PATH="$freetype_lib_path_unix"
AC_MSG_NOTICE([Compiling freetype sources succeeded! (see freetype.log for build results)])
else
BUILD_FREETYPE=no
fi
else
BUILD_FREETYPE=no
fi
fi
])
################################################################################
# Check if a potential freeype library match is correct and usable
################################################################################
AC_DEFUN([LIB_CHECK_POTENTIAL_FREETYPE],
[
POTENTIAL_FREETYPE_INCLUDE_PATH="$1"
POTENTIAL_FREETYPE_LIB_PATH="$2"
METHOD="$3"
# Let's start with an optimistic view of the world :-)
FOUND_FREETYPE=yes
# First look for the canonical freetype main include file ft2build.h.
if ! test -s "$POTENTIAL_FREETYPE_INCLUDE_PATH/ft2build.h"; then
# Oh no! Let's try in the freetype2 directory. This is needed at least at Mac OS X Yosemite.
POTENTIAL_FREETYPE_INCLUDE_PATH="$POTENTIAL_FREETYPE_INCLUDE_PATH/freetype2"
if ! test -s "$POTENTIAL_FREETYPE_INCLUDE_PATH/ft2build.h"; then
# Fail.
FOUND_FREETYPE=no
fi
fi
if test "x$FOUND_FREETYPE" = xyes; then
# Include file found, let's continue the sanity check.
AC_MSG_NOTICE([Found freetype include files at $POTENTIAL_FREETYPE_INCLUDE_PATH using $METHOD])
# Reset to default value
FREETYPE_BASE_NAME=freetype
FREETYPE_LIB_NAME="${LIBRARY_PREFIX}${FREETYPE_BASE_NAME}${SHARED_LIBRARY_SUFFIX}"
if ! test -s "$POTENTIAL_FREETYPE_LIB_PATH/$FREETYPE_LIB_NAME"; then
if test "x$OPENJDK_TARGET_OS" = xmacosx \
&& test -s "$POTENTIAL_FREETYPE_LIB_PATH/${LIBRARY_PREFIX}freetype.6${SHARED_LIBRARY_SUFFIX}"; then
# On Mac OS X Yosemite, the symlink from libfreetype.dylib to libfreetype.6.dylib disappeared. Check
# for the .6 version explicitly.
FREETYPE_BASE_NAME=freetype.6
FREETYPE_LIB_NAME="${LIBRARY_PREFIX}${FREETYPE_BASE_NAME}${SHARED_LIBRARY_SUFFIX}"
AC_MSG_NOTICE([Compensating for missing symlink by using version 6 explicitly])
else
AC_MSG_NOTICE([Could not find $POTENTIAL_FREETYPE_LIB_PATH/$FREETYPE_LIB_NAME. Ignoring location.])
FOUND_FREETYPE=no
fi
else
if test "x$OPENJDK_TARGET_OS" = xwindows; then
# On Windows, we will need both .lib and .dll file.
if ! test -s "$POTENTIAL_FREETYPE_LIB_PATH/${FREETYPE_BASE_NAME}.lib"; then
AC_MSG_NOTICE([Could not find $POTENTIAL_FREETYPE_LIB_PATH/${FREETYPE_BASE_NAME}.lib. Ignoring location.])
FOUND_FREETYPE=no
fi
elif test "x$OPENJDK_TARGET_OS" = xsolaris \
&& test -s "$POTENTIAL_FREETYPE_LIB_PATH$OPENJDK_TARGET_CPU_ISADIR/$FREETYPE_LIB_NAME"; then
# Found lib in isa dir, use that instead.
POTENTIAL_FREETYPE_LIB_PATH="$POTENTIAL_FREETYPE_LIB_PATH$OPENJDK_TARGET_CPU_ISADIR"
AC_MSG_NOTICE([Rewriting to use $POTENTIAL_FREETYPE_LIB_PATH instead])
fi
fi
fi
if test "x$FOUND_FREETYPE" = xyes; then
BASIC_FIXUP_PATH(POTENTIAL_FREETYPE_INCLUDE_PATH)
BASIC_FIXUP_PATH(POTENTIAL_FREETYPE_LIB_PATH)
FREETYPE_INCLUDE_PATH="$POTENTIAL_FREETYPE_INCLUDE_PATH"
AC_MSG_CHECKING([for freetype includes])
AC_MSG_RESULT([$FREETYPE_INCLUDE_PATH])
FREETYPE_LIB_PATH="$POTENTIAL_FREETYPE_LIB_PATH"
AC_MSG_CHECKING([for freetype libraries])
AC_MSG_RESULT([$FREETYPE_LIB_PATH])
fi
])
################################################################################
# Setup freetype (The FreeType2 font rendering library)
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_FREETYPE],
[
AC_ARG_WITH(freetype, [AS_HELP_STRING([--with-freetype],
[specify prefix directory for the freetype package
(expecting the libraries under PATH/lib and the headers under PATH/include)])])
AC_ARG_WITH(freetype-include, [AS_HELP_STRING([--with-freetype-include],
[specify directory for the freetype include files])])
AC_ARG_WITH(freetype-lib, [AS_HELP_STRING([--with-freetype-lib],
[specify directory for the freetype library])])
AC_ARG_WITH(freetype-src, [AS_HELP_STRING([--with-freetype-src],
[specify directory with freetype sources to automatically build the library (experimental, Windows-only)])])
AC_ARG_ENABLE(freetype-bundling, [AS_HELP_STRING([--disable-freetype-bundling],
[disable bundling of the freetype library with the build result @<:@enabled on Windows or when using --with-freetype, disabled otherwise@:>@])])
# Need to specify explicitly since it needs to be overridden on some versions of macosx
FREETYPE_BASE_NAME=freetype
FREETYPE_CFLAGS=
FREETYPE_LIBS=
FREETYPE_BUNDLE_LIB_PATH=
if test "x$NEEDS_LIB_FREETYPE" = xfalse; then
if test "x$with_freetype" != x || test "x$with_freetype_include" != x || test "x$with_freetype_lib" != x || test "x$with_freetype_src" != x; then
AC_MSG_WARN([freetype not used, so --with-freetype is ignored])
fi
if test "x$enable_freetype_bundling" != x; then
AC_MSG_WARN([freetype not used, so --enable-freetype-bundling is ignored])
fi
else
# freetype is needed to build; go get it!
BUNDLE_FREETYPE="$enable_freetype_bundling"
if test "x$with_freetype_src" != x; then
if test "x$OPENJDK_TARGET_OS" = xwindows; then
# Try to build freetype if --with-freetype-src was given on Windows
LIB_BUILD_FREETYPE([$with_freetype_src])
if test "x$BUILD_FREETYPE" = xyes; then
# Okay, we built it. Check that it works.
LIB_CHECK_POTENTIAL_FREETYPE($POTENTIAL_FREETYPE_INCLUDE_PATH, $POTENTIAL_FREETYPE_LIB_PATH, [--with-freetype-src])
if test "x$FOUND_FREETYPE" != xyes; then
AC_MSG_ERROR([Can not use the built freetype at location given by --with-freetype-src])
fi
else
AC_MSG_NOTICE([User specified --with-freetype-src but building freetype failed. (see freetype.log for build results)])
AC_MSG_ERROR([Consider building freetype manually and using --with-freetype instead.])
fi
else
AC_MSG_WARN([--with-freetype-src is currently only supported on Windows - ignoring])
fi
fi
if test "x$with_freetype" != x || test "x$with_freetype_include" != x || test "x$with_freetype_lib" != x; then
# User has specified settings
if test "x$BUNDLE_FREETYPE" = x; then
# If not specified, default is to bundle freetype
BUNDLE_FREETYPE=yes
fi
if test "x$with_freetype" != x; then
POTENTIAL_FREETYPE_INCLUDE_PATH="$with_freetype/include"
POTENTIAL_FREETYPE_LIB_PATH="$with_freetype/lib"
fi
# Allow --with-freetype-lib and --with-freetype-include to override
if test "x$with_freetype_include" != x; then
POTENTIAL_FREETYPE_INCLUDE_PATH="$with_freetype_include"
fi
if test "x$with_freetype_lib" != x; then
POTENTIAL_FREETYPE_LIB_PATH="$with_freetype_lib"
fi
if test "x$POTENTIAL_FREETYPE_INCLUDE_PATH" != x && test "x$POTENTIAL_FREETYPE_LIB_PATH" != x; then
# Okay, we got it. Check that it works.
LIB_CHECK_POTENTIAL_FREETYPE($POTENTIAL_FREETYPE_INCLUDE_PATH, $POTENTIAL_FREETYPE_LIB_PATH, [--with-freetype])
if test "x$FOUND_FREETYPE" != xyes; then
AC_MSG_ERROR([Can not find or use freetype at location given by --with-freetype])
fi
else
# User specified only one of lib or include. This is an error.
if test "x$POTENTIAL_FREETYPE_INCLUDE_PATH" = x ; then
AC_MSG_NOTICE([User specified --with-freetype-lib but not --with-freetype-include])
AC_MSG_ERROR([Need both freetype lib and include paths. Consider using --with-freetype instead.])
else
AC_MSG_NOTICE([User specified --with-freetype-include but not --with-freetype-lib])
AC_MSG_ERROR([Need both freetype lib and include paths. Consider using --with-freetype instead.])
fi
fi
else
# User did not specify settings, but we need freetype. Try to locate it.
if test "x$BUNDLE_FREETYPE" = x; then
# If not specified, default is to bundle freetype only on windows
if test "x$OPENJDK_TARGET_OS" = xwindows; then
BUNDLE_FREETYPE=yes
else
BUNDLE_FREETYPE=no
fi
fi
# If we have a sysroot, assume that's where we are supposed to look and skip pkg-config.
if test "x$SYSROOT" = x; then
if test "x$FOUND_FREETYPE" != xyes; then
# Check modules using pkg-config, but only if we have it (ugly output results otherwise)
if test "x$PKG_CONFIG" != x; then
PKG_CHECK_MODULES(FREETYPE, freetype2, [FOUND_FREETYPE=yes], [FOUND_FREETYPE=no])
if test "x$FOUND_FREETYPE" = xyes; then
# On solaris, pkg_check adds -lz to freetype libs, which isn't necessary for us.
FREETYPE_LIBS=`$ECHO $FREETYPE_LIBS | $SED 's/-lz//g'`
# 64-bit libs for Solaris x86 are installed in the amd64 subdirectory, change lib to lib/amd64
if test "x$OPENJDK_TARGET_OS" = xsolaris && test "x$OPENJDK_TARGET_CPU" = xx86_64; then
FREETYPE_LIBS=`$ECHO $FREETYPE_LIBS | $SED 's?/lib?/lib/amd64?g'`
fi
# PKG_CHECK_MODULES will set FREETYPE_CFLAGS and _LIBS, but we don't get a lib path for bundling.
if test "x$BUNDLE_FREETYPE" = xyes; then
AC_MSG_NOTICE([Found freetype using pkg-config, but ignoring since we can not bundle that])
FOUND_FREETYPE=no
else
AC_MSG_CHECKING([for freetype])
AC_MSG_RESULT([yes (using pkg-config)])
fi
fi
fi
fi
fi
if test "x$FOUND_FREETYPE" != xyes; then
# Check in well-known locations
if test "x$OPENJDK_TARGET_OS" = xwindows; then
FREETYPE_BASE_DIR="$PROGRAMFILES/GnuWin32"
BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(FREETYPE_BASE_DIR)
LIB_CHECK_POTENTIAL_FREETYPE([$FREETYPE_BASE_DIR/include], [$FREETYPE_BASE_DIR/lib], [well-known location])
if test "x$FOUND_FREETYPE" != xyes; then
FREETYPE_BASE_DIR="$ProgramW6432/GnuWin32"
BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(FREETYPE_BASE_DIR)
LIB_CHECK_POTENTIAL_FREETYPE([$FREETYPE_BASE_DIR/include], [$FREETYPE_BASE_DIR/lib], [well-known location])
fi
else
FREETYPE_BASE_DIR="$SYSROOT/usr"
LIB_CHECK_POTENTIAL_FREETYPE([$FREETYPE_BASE_DIR/include], [$FREETYPE_BASE_DIR/lib], [well-known location])
if test "x$FOUND_FREETYPE" != xyes; then
FREETYPE_BASE_DIR="$SYSROOT/usr/X11"
LIB_CHECK_POTENTIAL_FREETYPE([$FREETYPE_BASE_DIR/include], [$FREETYPE_BASE_DIR/lib], [well-known location])
fi
if test "x$FOUND_FREETYPE" != xyes; then
FREETYPE_BASE_DIR="$SYSROOT/usr/sfw"
LIB_CHECK_POTENTIAL_FREETYPE([$FREETYPE_BASE_DIR/include], [$FREETYPE_BASE_DIR/lib], [well-known location])
fi
if test "x$FOUND_FREETYPE" != xyes; then
FREETYPE_BASE_DIR="$SYSROOT/usr"
if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then
LIB_CHECK_POTENTIAL_FREETYPE([$FREETYPE_BASE_DIR/include], [$FREETYPE_BASE_DIR/lib/x86_64-linux-gnu], [well-known location])
else
LIB_CHECK_POTENTIAL_FREETYPE([$FREETYPE_BASE_DIR/include], [$FREETYPE_BASE_DIR/lib/i386-linux-gnu], [well-known location])
if test "x$FOUND_FREETYPE" != xyes; then
LIB_CHECK_POTENTIAL_FREETYPE([$FREETYPE_BASE_DIR/include], [$FREETYPE_BASE_DIR/lib32], [well-known location])
fi
fi
fi
fi
fi # end check in well-known locations
if test "x$FOUND_FREETYPE" != xyes; then
HELP_MSG_MISSING_DEPENDENCY([freetype])
AC_MSG_ERROR([Could not find freetype! $HELP_MSG ])
fi
fi # end user specified settings
# Set FREETYPE_CFLAGS, _LIBS and _LIB_PATH from include and lib dir.
if test "x$FREETYPE_CFLAGS" = x; then
BASIC_FIXUP_PATH(FREETYPE_INCLUDE_PATH)
if test -d $FREETYPE_INCLUDE_PATH/freetype2/freetype; then
FREETYPE_CFLAGS="-I$FREETYPE_INCLUDE_PATH/freetype2 -I$FREETYPE_INCLUDE_PATH"
else
FREETYPE_CFLAGS="-I$FREETYPE_INCLUDE_PATH"
fi
fi
if test "x$FREETYPE_LIBS" = x; then
BASIC_FIXUP_PATH(FREETYPE_LIB_PATH)
if test "x$OPENJDK_TARGET_OS" = xwindows; then
FREETYPE_LIBS="$FREETYPE_LIB_PATH/$FREETYPE_BASE_NAME.lib"
else
FREETYPE_LIBS="-L$FREETYPE_LIB_PATH -l$FREETYPE_BASE_NAME"
fi
fi
# Try to compile it
AC_MSG_CHECKING([if we can compile and link with freetype])
AC_LANG_PUSH(C++)
PREV_CXXCFLAGS="$CXXFLAGS"
PREV_LIBS="$LIBS"
PREV_CXX="$CXX"
CXXFLAGS="$CXXFLAGS $FREETYPE_CFLAGS"
LIBS="$LIBS $FREETYPE_LIBS"
CXX="$FIXPATH $CXX"
AC_LINK_IFELSE([AC_LANG_SOURCE([[
#include<ft2build.h>
#include FT_FREETYPE_H
int main () {
FT_Init_FreeType(NULL);
return 0;
}
]])],
[
AC_MSG_RESULT([yes])
],
[
AC_MSG_RESULT([no])
AC_MSG_NOTICE([Could not compile and link with freetype. This might be a 32/64-bit mismatch.])
AC_MSG_NOTICE([Using FREETYPE_CFLAGS=$FREETYPE_CFLAGS and FREETYPE_LIBS=$FREETYPE_LIBS])
HELP_MSG_MISSING_DEPENDENCY([freetype])
AC_MSG_ERROR([Can not continue without freetype. $HELP_MSG])
]
)
CXXCFLAGS="$PREV_CXXFLAGS"
LIBS="$PREV_LIBS"
CXX="$PREV_CXX"
AC_LANG_POP(C++)
AC_MSG_CHECKING([if we should bundle freetype])
if test "x$BUNDLE_FREETYPE" = xyes; then
FREETYPE_BUNDLE_LIB_PATH="$FREETYPE_LIB_PATH"
fi
AC_MSG_RESULT([$BUNDLE_FREETYPE])
fi # end freetype needed
AC_SUBST(FREETYPE_BUNDLE_LIB_PATH)
AC_SUBST(FREETYPE_CFLAGS)
AC_SUBST(FREETYPE_LIBS)
])

120
common/autoconf/lib-std.m4 Normal file

@ -0,0 +1,120 @@
#
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# 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.
#
################################################################################
# Setup the standard C/C++ runtime libraries.
#
# Most importantly, determine if stdc++ should be linked statically or
# dynamically.
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_STD_LIBS],
[
# statically link libstdc++ before C++ ABI is stablized on Linux unless
# dynamic build is configured on command line.
AC_ARG_WITH([stdc++lib], [AS_HELP_STRING([--with-stdc++lib=<static>,<dynamic>,<default>],
[force linking of the C++ runtime on Linux to either static or dynamic, default is static with dynamic as fallback])],
[
if test "x$with_stdc__lib" != xdynamic && test "x$with_stdc__lib" != xstatic \
&& test "x$with_stdc__lib" != xdefault; then
AC_MSG_ERROR([Bad parameter value --with-stdc++lib=$with_stdc__lib!])
fi
],
[with_stdc__lib=default]
)
if test "x$OPENJDK_TARGET_OS" = xlinux; then
# Test if -lstdc++ works.
AC_MSG_CHECKING([if dynamic link of stdc++ is possible])
AC_LANG_PUSH(C++)
OLD_CXXFLAGS="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS -lstdc++"
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
[has_dynamic_libstdcxx=yes],
[has_dynamic_libstdcxx=no])
CXXFLAGS="$OLD_CXXFLAGS"
AC_LANG_POP(C++)
AC_MSG_RESULT([$has_dynamic_libstdcxx])
# Test if stdc++ can be linked statically.
AC_MSG_CHECKING([if static link of stdc++ is possible])
STATIC_STDCXX_FLAGS="-Wl,-Bstatic -lstdc++ -lgcc -Wl,-Bdynamic"
AC_LANG_PUSH(C++)
OLD_LIBS="$LIBS"
OLD_CXX="$CXX"
LIBS="$STATIC_STDCXX_FLAGS"
CXX="$CC"
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
[has_static_libstdcxx=yes],
[has_static_libstdcxx=no])
LIBS="$OLD_LIBS"
CXX="$OLD_CXX"
AC_LANG_POP(C++)
AC_MSG_RESULT([$has_static_libstdcxx])
if test "x$has_static_libstdcxx" = xno && test "x$has_dynamic_libstdcxx" = xno; then
AC_MSG_ERROR([Cannot link to stdc++, neither dynamically nor statically!])
fi
if test "x$with_stdc__lib" = xstatic && test "x$has_static_libstdcxx" = xno; then
AC_MSG_ERROR([Static linking of libstdc++ was not possible!])
fi
if test "x$with_stdc__lib" = xdynamic && test "x$has_dynamic_libstdcxx" = xno; then
AC_MSG_ERROR([Dynamic linking of libstdc++ was not possible!])
fi
# If dynamic was requested, it's available since it would fail above otherwise.
# If dynamic wasn't requested, go with static unless it isn't available.
AC_MSG_CHECKING([how to link with libstdc++])
if test "x$with_stdc__lib" = xdynamic || test "x$has_static_libstdcxx" = xno || test "x$JVM_VARIANT_ZEROSHARK" = xtrue; then
LIBCXX="$LIBCXX -lstdc++"
LDCXX="$CXX"
STATIC_CXX_SETTING="STATIC_CXX=false"
AC_MSG_RESULT([dynamic])
else
LIBCXX="$LIBCXX $STATIC_STDCXX_FLAGS"
LDCXX="$CC"
STATIC_CXX_SETTING="STATIC_CXX=true"
AC_MSG_RESULT([static])
fi
fi
AC_SUBST(STATIC_CXX_SETTING)
# libCrun is the c++ runtime-library with SunStudio (roughly the equivalent of gcc's libstdc++.so)
if test "x$TOOLCHAIN_TYPE" = xsolstudio && test "x$LIBCXX" = x; then
LIBCXX="${SYSROOT}/usr/lib${OPENJDK_TARGET_CPU_ISADIR}/libCrun.so.1"
fi
# TODO better (platform agnostic) test
if test "x$OPENJDK_TARGET_OS" = xmacosx && test "x$LIBCXX" = x && test "x$TOOLCHAIN_TYPE" = xgcc; then
LIBCXX="-lstdc++"
fi
AC_SUBST(LIBCXX)
# Setup Windows runtime dlls
if test "x$OPENJDK_TARGET_OS" = "xwindows"; then
TOOLCHAIN_SETUP_VS_RUNTIME_DLLS
fi
])

135
common/autoconf/lib-x11.m4 Normal file

@ -0,0 +1,135 @@
#
# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# 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.
#
################################################################################
# Setup X11 Windows system
################################################################################
AC_DEFUN_ONCE([LIB_SETUP_X11],
[
if test "x$NEEDS_LIB_X11" = xfalse; then
if test "x${with_x}" != x; then
AC_MSG_WARN([X11 is not used, so --with-x is ignored])
fi
X_CFLAGS=
X_LIBS=
else
if test "x${with_x}" = xno; then
AC_MSG_ERROR([It is not possible to disable the use of X11. Remove the --without-x option.])
fi
if test "x${with_x}" != x && test "x${with_x}" != xyes; then
# The user has specified a X11 base directory. Use it for includes and
# libraries, unless explicitely overridden.
if test "x$x_includes" = xNONE; then
x_includes="${with_x}/include"
fi
if test "x$x_libraries" = xNONE; then
x_libraries="${with_x}/lib"
fi
else
# Check if the user has specified sysroot, but not --with-x, --x-includes or --x-libraries.
# Make a simple check for the libraries at the sysroot, and setup --x-includes and
# --x-libraries for the sysroot, if that seems to be correct.
if test "x$SYSROOT" != "x"; then
if test "x$x_includes" = xNONE; then
if test -f "$SYSROOT/usr/X11R6/include/X11/Xlib.h"; then
x_includes="$SYSROOT/usr/X11R6/include"
elif test -f "$SYSROOT/usr/include/X11/Xlib.h"; then
x_includes="$SYSROOT/usr/include"
fi
fi
if test "x$x_libraries" = xNONE; then
if test -f "$SYSROOT/usr/X11R6/lib/libX11.so"; then
x_libraries="$SYSROOT/usr/X11R6/lib"
elif test -f "$SYSROOT/usr/lib64/libX11.so" && test "x$OPENJDK_TARGET_CPU_BITS" = x64; then
x_libraries="$SYSROOT/usr/lib64"
elif test -f "$SYSROOT/usr/lib/libX11.so"; then
x_libraries="$SYSROOT/usr/lib"
fi
fi
fi
fi
# Now let autoconf do it's magic
AC_PATH_X
AC_PATH_XTRA
# AC_PATH_XTRA creates X_LIBS and sometimes adds -R flags. When cross compiling
# this doesn't make sense so we remove it.
if test "x$COMPILE_TYPE" = xcross; then
X_LIBS=`$ECHO $X_LIBS | $SED 's/-R \{0,1\}[[^ ]]*//g'`
fi
if test "x$no_x" = xyes; then
HELP_MSG_MISSING_DEPENDENCY([x11])
AC_MSG_ERROR([Could not find X11 libraries. $HELP_MSG])
fi
if test "x$OPENJDK_TARGET_OS" = xsolaris; then
OPENWIN_HOME="/usr/openwin"
X_CFLAGS="-I$SYSROOT$OPENWIN_HOME/include -I$SYSROOT$OPENWIN_HOME/include/X11/extensions"
X_LIBS="-L$SYSROOT$OPENWIN_HOME/sfw/lib$OPENJDK_TARGET_CPU_ISADIR \
-L$SYSROOT$OPENWIN_HOME/lib$OPENJDK_TARGET_CPU_ISADIR \
-R$OPENWIN_HOME/sfw/lib$OPENJDK_TARGET_CPU_ISADIR \
-R$OPENWIN_HOME/lib$OPENJDK_TARGET_CPU_ISADIR"
fi
AC_LANG_PUSH(C)
OLD_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $SYSROOT_CFLAGS $X_CFLAGS"
# Need to include Xlib.h and Xutil.h to avoid "present but cannot be compiled" warnings on Solaris 10
AC_CHECK_HEADERS([X11/extensions/shape.h X11/extensions/Xrender.h X11/extensions/XTest.h X11/Intrinsic.h],
[X11_HEADERS_OK=yes],
[X11_HEADERS_OK=no; break],
[
# include <X11/Xlib.h>
# include <X11/Xutil.h>
]
)
if test "x$X11_HEADERS_OK" = xno; then
HELP_MSG_MISSING_DEPENDENCY([x11])
AC_MSG_ERROR([Could not find all X11 headers (shape.h Xrender.h XTest.h Intrinsic.h). $HELP_MSG])
fi
# If XLinearGradient isn't available in Xrender.h, signal that it needs to be
# defined in libawt_xawt.
AC_MSG_CHECKING([if XlinearGradient is defined in Xrender.h])
AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM([[#include <X11/extensions/Xrender.h>]],
[[XLinearGradient x;]])],
[AC_MSG_RESULT([yes])],
[AC_MSG_RESULT([no])
X_CFLAGS="$X_CFLAGS -DSOLARIS10_NO_XRENDER_STRUCTS"])
CFLAGS="$OLD_CFLAGS"
AC_LANG_POP(C)
fi # NEEDS_LIB_X11
AC_SUBST(X_CFLAGS)
AC_SUBST(X_LIBS)
])

File diff suppressed because it is too large Load Diff

@ -96,7 +96,7 @@ REQUIRED_OS_NAME:=@REQUIRED_OS_NAME@
REQUIRED_OS_VERSION:=@REQUIRED_OS_VERSION@ REQUIRED_OS_VERSION:=@REQUIRED_OS_VERSION@
@SET_OPENJDK@ @SET_OPENJDK@
LIBM:=-lm LIBM:=@LIBM@
LIBDL:=@LIBDL@ LIBDL:=@LIBDL@
# colon or semicolon # colon or semicolon
@ -499,6 +499,7 @@ LN:=@LN@
MKDIR:=@MKDIR@ MKDIR:=@MKDIR@
MV:=@MV@ MV:=@MV@
NAWK:=@NAWK@ NAWK:=@NAWK@
NICE:=@NICE@
PATCH:=@PATCH@ PATCH:=@PATCH@
PRINTF:=@PRINTF@ PRINTF:=@PRINTF@
PWD:=@THEPWDCMD@ PWD:=@THEPWDCMD@

@ -327,3 +327,4 @@ d8126bc88fa5cd1ae4e44d86a4b1280ca1c9e2aa jdk9-b76
c20d8ebddaa6fb09cc81d3edf3d1d05f4232700a jdk9-b82 c20d8ebddaa6fb09cc81d3edf3d1d05f4232700a jdk9-b82
ca8a1719588424f6e04e943790c7fcb7cb0b8c8f jdk9-b83 ca8a1719588424f6e04e943790c7fcb7cb0b8c8f jdk9-b83
df70bb200356fec686681f0295c50cc3ed43c3b3 jdk9-b84 df70bb200356fec686681f0295c50cc3ed43c3b3 jdk9-b84
3ec06af1368924469f7ce60a00324bac55eaeecc jdk9-b85

@ -487,3 +487,4 @@ e9e63d93bbfe2c6c23447e2c1f5cc71c98671cba jdk9-b79
1c453a12be3036d482abef1dd470f8aff536b6b9 jdk9-b82 1c453a12be3036d482abef1dd470f8aff536b6b9 jdk9-b82
3ed0df2c553a80e0e26b91a6ce08806ea17a066a jdk9-b83 3ed0df2c553a80e0e26b91a6ce08806ea17a066a jdk9-b83
184c4328444974edd6b3b490b9d0177ace7e331c jdk9-b84 184c4328444974edd6b3b490b9d0177ace7e331c jdk9-b84
03845376ea9dbf9690b6a9cfb4ed63f8cc0541c0 jdk9-b85

@ -23,8 +23,8 @@
import sun.hotspot.WhiteBox; import sun.hotspot.WhiteBox;
import sun.misc.Unsafe; import sun.misc.Unsafe;
import sun.misc.IOUtils;
import java.io.IOException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.net.URL; import java.net.URL;
import java.net.URLConnection; import java.net.URLConnection;
@ -109,7 +109,13 @@ public class TestAnonymousClassUnloading {
// (1) Load an anonymous version of this class using the corresponding Unsafe method // (1) Load an anonymous version of this class using the corresponding Unsafe method
URL classUrl = TestAnonymousClassUnloading.class.getResource("TestAnonymousClassUnloading.class"); URL classUrl = TestAnonymousClassUnloading.class.getResource("TestAnonymousClassUnloading.class");
URLConnection connection = classUrl.openConnection(); URLConnection connection = classUrl.openConnection();
byte[] classBytes = IOUtils.readFully(connection.getInputStream(), connection.getContentLength(), true);
int length = connection.getContentLength();
byte[] classBytes = connection.getInputStream().readAllBytes();
if (length != -1 && classBytes.length != length) {
throw new IOException("Expected:" + length + ", actual: " + classBytes.length);
}
Class<?> anonymousClass = UNSAFE.defineAnonymousClass(TestAnonymousClassUnloading.class, classBytes, null); Class<?> anonymousClass = UNSAFE.defineAnonymousClass(TestAnonymousClassUnloading.class, classBytes, null);
// (2) Make sure all paths of doWork are profiled and compiled // (2) Make sure all paths of doWork are profiled and compiled

@ -72,8 +72,10 @@ public class VictimClassLoader extends ClassLoader {
} }
static byte[] readFully(java.io.InputStream in, int len) throws java.io.IOException { static byte[] readFully(java.io.InputStream in, int len) throws java.io.IOException {
// Warning here: byte[] b = in.readAllBytes();
return sun.misc.IOUtils.readFully(in, len, true); if (len != -1 && b.length != len)
throw new java.io.IOException("Expected:" + len + ", actual:" + b.length);
return b;
} }
public void finalize() { public void finalize() {

@ -327,3 +327,4 @@ f464f9b2fb1178f6a957e5730b4b5252c6149ed9 jdk9-b80
53fe3c103b6fdf48e2b2676c0c4818ef5a10fa21 jdk9-b82 53fe3c103b6fdf48e2b2676c0c4818ef5a10fa21 jdk9-b82
497bc2654e11684b11de46744227883d7e760f35 jdk9-b83 497bc2654e11684b11de46744227883d7e760f35 jdk9-b83
91795d86744f3074d1e59b1e75d9c851c098688f jdk9-b84 91795d86744f3074d1e59b1e75d9c851c098688f jdk9-b84
1d9850c1b35c74e8b5c17970ed5d46dc0fc33f06 jdk9-b85

@ -330,3 +330,4 @@ e9940bf1c8ddaa6f1f5f1813846b080f0ccaf50b jdk9-b80
52d9ad2536ba6c6f1cc5561c0a0ee2b4847fd62c jdk9-b82 52d9ad2536ba6c6f1cc5561c0a0ee2b4847fd62c jdk9-b82
d7ee8157f4feced67924e421225c6f844079a03d jdk9-b83 d7ee8157f4feced67924e421225c6f844079a03d jdk9-b83
51729143f8fe038f52cf55720c4c1f89267f5948 jdk9-b84 51729143f8fe038f52cf55720c4c1f89267f5948 jdk9-b84
67b626ec730d2601d95ef036d06be34b37fa9ce6 jdk9-b85

@ -327,3 +327,4 @@ fdc13a2d32867ca3c57b7fa2620c6b59c83168cb jdk9-b81
b10b64263b563e21f055c881444f625ec618b826 jdk9-b82 b10b64263b563e21f055c881444f625ec618b826 jdk9-b82
d11f25ce3c545823f53bb978d454a4d2901abac3 jdk9-b83 d11f25ce3c545823f53bb978d454a4d2901abac3 jdk9-b83
757ef7f6d0042934edea3e0bf616fad2c1a22789 jdk9-b84 757ef7f6d0042934edea3e0bf616fad2c1a22789 jdk9-b84
fe40b31c0e526d357cf5b62044fea006e43b53a5 jdk9-b85

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1994, 2008, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1994, 2015, 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
@ -26,42 +26,58 @@
package java.lang; package java.lang;
/** /**
* Thrown to indicate that an array has been accessed with an * Thrown to indicate that an array has been accessed with an illegal index. The
* illegal index. The index is either negative or greater than or * index is either negative or greater than or equal to the size of the array.
* equal to the size of the array.
* *
* @author unascribed * @since 1.0
* @since 1.0
*/ */
public public class ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException {
class ArrayIndexOutOfBoundsException extends IndexOutOfBoundsException {
private static final long serialVersionUID = -5116101128118950844L; private static final long serialVersionUID = -5116101128118950844L;
/** /**
* Constructs an <code>ArrayIndexOutOfBoundsException</code> with no * Constructs an {@code ArrayIndexOutOfBoundsException} with no detail
* detail message. * message.
*/ */
public ArrayIndexOutOfBoundsException() { public ArrayIndexOutOfBoundsException() {
super(); super();
} }
/** /**
* Constructs a new <code>ArrayIndexOutOfBoundsException</code> * Constructs an {@code ArrayIndexOutOfBoundsException} class with the
* class with an argument indicating the illegal index. * specified detail message.
* *
* @param index the illegal index. * @param s the detail message.
*/
public ArrayIndexOutOfBoundsException(String s) {
super(s);
}
/**
* Constructs a new {@code ArrayIndexOutOfBoundsException} class with an
* argument indicating the illegal index.
*
* <p>The index is included in this exception's detail message. The
* exact presentation format of the detail message is unspecified.
*
* @param index the illegal index.
*/ */
public ArrayIndexOutOfBoundsException(int index) { public ArrayIndexOutOfBoundsException(int index) {
super("Array index out of range: " + index); super("Array index out of range: " + index);
} }
/** /**
* Constructs an <code>ArrayIndexOutOfBoundsException</code> class * Constructs a new {@code ArrayIndexOutOfBoundsException} class with
* with the specified detail message. * arguments indicating two out of bound values.
* *
* @param s the detail message. * <p>The out of bound values are included in this exception's detail
* message. The exact presentation format of the detail message is
* unspecified.
*
* @param a the first out of bound value.
* @param b the second out of bound value.
* @since 9
*/ */
public ArrayIndexOutOfBoundsException(String s) { public ArrayIndexOutOfBoundsException(int a, int b) {
super(s); super("Array indexed access out of bounds: " + a + ", " + b);
} }
} }

@ -182,7 +182,7 @@ class FdLibm {
} }
int k = 0; int k = 0;
if (a > 0x1.0p500) { // a > 2**500 if (a > 0x1.00000_ffff_ffffp500) { // a > ~2**500
// scale a and b by 2**-600 // scale a and b by 2**-600
ha -= 0x25800000; ha -= 0x25800000;
hb -= 0x25800000; hb -= 0x25800000;

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * 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
@ -31,28 +31,57 @@ package java.lang;
* <p> * <p>
* Applications can subclass this class to indicate similar exceptions. * Applications can subclass this class to indicate similar exceptions.
* *
* @author Frank Yellin * @author Frank Yellin
* @since 1.0 * @since 1.0
*/ */
public public class IndexOutOfBoundsException extends RuntimeException {
class IndexOutOfBoundsException extends RuntimeException {
private static final long serialVersionUID = 234122996006267687L; private static final long serialVersionUID = 234122996006267687L;
/** /**
* Constructs an <code>IndexOutOfBoundsException</code> with no * Constructs an {@code IndexOutOfBoundsException} with no detail message.
* detail message.
*/ */
public IndexOutOfBoundsException() { public IndexOutOfBoundsException() {
super(); super();
} }
/** /**
* Constructs an <code>IndexOutOfBoundsException</code> with the * Constructs an {@code IndexOutOfBoundsException} with the specified detail
* specified detail message. * message.
* *
* @param s the detail message. * @param s the detail message
*/ */
public IndexOutOfBoundsException(String s) { public IndexOutOfBoundsException(String s) {
super(s); super(s);
} }
/**
* Constructs a new {@code IndexOutOfBoundsException} class with an
* argument indicating the illegal index.
*
* <p>The index is included in this exception's detail message. The
* exact presentation format of the detail message is unspecified.
*
* @param index the illegal index.
* @since 9
*/
public IndexOutOfBoundsException(int index) {
super("Index out of range: " + index);
}
/**
* Constructs an {@code IndexOutOfBoundsException} with arguments indicating
* two out of bound values.
*
* <p>The out of bound values are included in this exception's detail
* message. The exact presentation format of the detail message is
* unspecified.
*
* @param a the first out of bound value
* @param b the second out of bound value
* @since 9
*/
public IndexOutOfBoundsException(int a, int b) {
super("Indexed access out of bounds: " + a + ", " + b);
}
} }

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1994, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1994, 2015, 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
@ -26,44 +26,61 @@
package java.lang; package java.lang;
/** /**
* Thrown by {@code String} methods to indicate that an index * Thrown by {@code String} methods to indicate that an index is either negative
* is either negative or greater than the size of the string. For * or greater than the size of the string. For some methods such as the
* some methods such as the charAt method, this exception also is * {@link String#charAt charAt} method, this exception also is thrown when the
* thrown when the index is equal to the size of the string. * index is equal to the size of the string.
* *
* @author unascribed * @see java.lang.String#charAt(int)
* @see java.lang.String#charAt(int) * @since 1.0
* @since 1.0
*/ */
public public class StringIndexOutOfBoundsException extends IndexOutOfBoundsException {
class StringIndexOutOfBoundsException extends IndexOutOfBoundsException {
private static final long serialVersionUID = -6762910422159637258L; private static final long serialVersionUID = -6762910422159637258L;
/** /**
* Constructs a {@code StringIndexOutOfBoundsException} with no * Constructs a {@code StringIndexOutOfBoundsException} with no detail
* detail message. * message.
*/ */
public StringIndexOutOfBoundsException() { public StringIndexOutOfBoundsException() {
super(); super();
} }
/** /**
* Constructs a {@code StringIndexOutOfBoundsException} with * Constructs a {@code StringIndexOutOfBoundsException} with the specified
* the specified detail message. * detail message.
* *
* @param s the detail message. * @param s the detail message.
*/ */
public StringIndexOutOfBoundsException(String s) { public StringIndexOutOfBoundsException(String s) {
super(s); super(s);
} }
/** /**
* Constructs a new {@code StringIndexOutOfBoundsException} * Constructs a new {@code StringIndexOutOfBoundsException} class with an
* class with an argument indicating the illegal index. * argument indicating the illegal index.
* *
* @param index the illegal index. * <p>The index is included in this exception's detail message. The
* exact presentation format of the detail message is unspecified.
*
* @param index the illegal index.
*/ */
public StringIndexOutOfBoundsException(int index) { public StringIndexOutOfBoundsException(int index) {
super("String index out of range: " + index); super("String index out of range: " + index);
} }
/**
* Constructs a new {@code StringIndexOutOfBoundsException} class with
* arguments indicating two out of bound values.
*
* <p>The out of bound values are included in this exception's detail
* message. The exact presentation format of the detail message is
* unspecified.
*
* @param a the first out of bound value.
* @param b the second out of bound value.
* @since 9
*/
public StringIndexOutOfBoundsException(int a, int b) {
super("String indexed access out of bounds: " + a + ", " + b);
}
} }

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * 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
@ -79,8 +79,10 @@ public abstract class AuthProvider extends Provider {
* this provider to obtain authentication information * this provider to obtain authentication information
* from the caller, which may be {@code null} * from the caller, which may be {@code null}
* *
* @exception LoginException if the login operation fails * @throws IllegalStateException if the provider requires configuration
* @exception SecurityException if the caller does not pass a * and {@link configure} has not been called
* @throws LoginException if the login operation fails
* @throws SecurityException if the caller does not pass a
* security check for * security check for
* {@code SecurityPermission("authProvider.name")}, * {@code SecurityPermission("authProvider.name")},
* where {@code name} is the value returned by * where {@code name} is the value returned by
@ -92,8 +94,10 @@ public abstract class AuthProvider extends Provider {
/** /**
* Log out from this provider. * Log out from this provider.
* *
* @exception LoginException if the logout operation fails * @throws IllegalStateException if the provider requires configuration
* @exception SecurityException if the caller does not pass a * and {@link configure} has not been called
* @throws LoginException if the logout operation fails
* @throws SecurityException if the caller does not pass a
* security check for * security check for
* {@code SecurityPermission("authProvider.name")}, * {@code SecurityPermission("authProvider.name")},
* where {@code name} is the value returned by * where {@code name} is the value returned by
@ -118,7 +122,9 @@ public abstract class AuthProvider extends Provider {
* @param handler a {@code CallbackHandler} for obtaining * @param handler a {@code CallbackHandler} for obtaining
* authentication information, which may be {@code null} * authentication information, which may be {@code null}
* *
* @exception SecurityException if the caller does not pass a * @throws IllegalStateException if the provider requires configuration
* and {@link configure} has not been called
* @throws SecurityException if the caller does not pass a
* security check for * security check for
* {@code SecurityPermission("authProvider.name")}, * {@code SecurityPermission("authProvider.name")},
* where {@code name} is the value returned by * where {@code name} is the value returned by

@ -187,12 +187,29 @@ public abstract class Provider extends Properties {
* is invalid. * is invalid.
* @return a provider configured with the supplied configuration argument. * @return a provider configured with the supplied configuration argument.
* *
* @since 1.9 * @since 9
*/ */
public Provider configure(String configArg) { public Provider configure(String configArg) {
throw new UnsupportedOperationException("configure is not supported"); throw new UnsupportedOperationException("configure is not supported");
} }
/**
* Check if this provider instance has been configured.
*
* @implSpec
* The default implementation returns true.
* Subclasses should override this method if the provider instance requires
* an explicit {@code configure} call after being constructed.
*
* @return true if no further configuration is needed, false otherwise.
*
* @since 9
*/
public boolean isConfigured() {
return true;
}
/** /**
* Returns the name of this provider. * Returns the name of this provider.
* *

@ -53,6 +53,17 @@ import java.util.StringTokenizer;
* </tr> * </tr>
* *
* <tr> * <tr>
* <td>authProvider.{provider name}</td>
* <td>Allow the named provider to be an AuthProvider for login and
* logout operations. </td>
* <td>This allows the named provider to perform login and logout
* operations. The named provider must extend {@code AuthProvider}
* and care must be taken to grant to a trusted provider since
* login operations involve sensitive authentication information
* such as PINs and passwords. </td>
* </tr>
*
* <tr>
* <td>createAccessControlContext</td> * <td>createAccessControlContext</td>
* <td>Creation of an AccessControlContext</td> * <td>Creation of an AccessControlContext</td>
* <td>This allows someone to instantiate an AccessControlContext * <td>This allows someone to instantiate an AccessControlContext

@ -371,8 +371,8 @@ public final class Currency implements Serializable {
* instance is needed * instance is needed
* @return the <code>Currency</code> instance for the country of the given * @return the <code>Currency</code> instance for the country of the given
* locale, or {@code null} * locale, or {@code null}
* @exception NullPointerException if <code>locale</code> or its country * @exception NullPointerException if <code>locale</code>
* code is {@code null} * is {@code null}
* @exception IllegalArgumentException if the country of the given {@code locale} * @exception IllegalArgumentException if the country of the given {@code locale}
* is not a supported ISO 3166 country code. * is not a supported ISO 3166 country code.
*/ */

@ -25,13 +25,29 @@
package java.util; package java.util;
import java.util.function.BiFunction;
import java.util.function.Supplier; import java.util.function.Supplier;
/** /**
* This class consists of {@code static} utility methods for operating * This class consists of {@code static} utility methods for operating
* on objects. These utilities include {@code null}-safe or {@code * on objects, or checking certain conditions before operation. These utilities
* null}-tolerant methods for computing the hash code of an object, * include {@code null}-safe or {@code null}-tolerant methods for computing the
* returning a string for an object, and comparing two objects. * hash code of an object, returning a string for an object, comparing two
* objects, and checking if indexes or sub-range values are out of bounds.
*
* @apiNote
* Static methods such as {@link Objects#checkIndex},
* {@link Objects#checkFromToIndex}, and {@link Objects#checkFromIndexSize} are
* provided for the convenience of checking if values corresponding to indexes
* and sub-ranges are out of bounds.
* Variations of these static methods support customization of the runtime
* exception, and corresponding exception detail message, that is thrown when
* values are out of bounds. Such methods accept a functional interface
* argument, instances of {@code BiFunction}, that maps out of bound values to a
* runtime exception. Care should be taken when using such methods in
* combination with an argument that is a lambda expression, method reference or
* class that capture values. In such cases the cost of capture, related to
* functional interface allocation, may exceed the cost of checking bounds.
* *
* @since 1.7 * @since 1.7
*/ */
@ -290,4 +306,230 @@ public final class Objects {
throw new NullPointerException(messageSupplier.get()); throw new NullPointerException(messageSupplier.get());
return obj; return obj;
} }
/**
* Maps out of bounds values to a runtime exception.
*
* @param a the first out of bound value
* @param b the second out of bound value
* @param oobe the exception mapping function that when applied with out of
* bounds arguments returns a runtime exception. If {@code null}
* then, it's as if an exception mapping function was supplied that
* returns {@link IndexOutOfBoundsException} for any given arguments.
* @return the runtime exception
*/
private static RuntimeException outOfBounds(
int a, int b, BiFunction<Integer, Integer, ? extends RuntimeException> oobe) {
return oobe == null
? new IndexOutOfBoundsException(a, b)
: oobe.apply(a, b);
}
/**
* Checks if the {@code index} is within the bounds of the range from
* {@code 0} (inclusive) to {@code length} (exclusive).
*
* <p>The {@code index} is defined to be out of bounds if any of the
* following inequalities is true:
* <ul>
* <li>{@code index < 0}</li>
* <li>{@code index >= length}</li>
* <li>{@code length < 0}, which is implied from the former inequalities</li>
* </ul>
*
* @param index the index
* @param length the upper-bound (exclusive) of the range
* @return {@code index} if it is within bounds of the range
* @throws IndexOutOfBoundsException if the {@code index} is out of bounds
* @since 9
*/
public static
int checkIndex(int index, int length) throws IndexOutOfBoundsException {
return checkIndex(index, length, null);
}
/**
* Checks if the {@code index} is within the bounds of the range from
* {@code 0} (inclusive) to {@code length} (exclusive).
*
* <p>The {@code index} is defined to be out of bounds if any of the
* following inequalities is true:
* <ul>
* <li>{@code index < 0}</li>
* <li>{@code index >= length}</li>
* <li>{@code length < 0}, which is implied from the former inequalities</li>
* </ul>
*
* <p>If the {@code index} is out of bounds, then a runtime exception is
* thrown that is the result of applying the arguments {@code index} and
* {@code length} to the given exception mapping function.
*
* @param <T> the type of runtime exception to throw if the arguments are
* out of bounds
* @param index the index
* @param length the upper-bound (exclusive) of the range
* @param oobe the exception mapping function that when applied with out
* of bounds arguments returns a runtime exception. If {@code null}
* then, it's as if an exception mapping function was supplied that
* returns {@link IndexOutOfBoundsException} for any given arguments.
* @return {@code index} if it is within bounds of the range
* @throws T if the {@code index} is out of bounds, then a runtime exception
* is thrown that is the result of applying the out of bounds
* arguments to the exception mapping function.
* @throws IndexOutOfBoundsException if the {@code index} is out of bounds
* and the exception mapping function is {@code null}
* @since 9
*/
/*
@HotSpotIntrinsicCandidate
This method will be made intrinsic in C2 to guide HotSpot to perform
unsigned comparisons of the index and length when it is known the length is
a non-negative value (such as that of an array length or from the upper
bound of a loop)
*/
public static <T extends RuntimeException>
int checkIndex(int index, int length,
BiFunction<Integer, Integer, T> oobe) throws T, IndexOutOfBoundsException {
if (index < 0 || index >= length)
throw outOfBounds(index, length, oobe);
return index;
}
/**
* Checks if the sub-range from {@code fromIndex} (inclusive) to
* {@code toIndex} (exclusive) is within the bounds of range from {@code 0}
* (inclusive) to {@code length} (exclusive).
*
* <p>The sub-range is defined to be out of bounds if any of the following
* inequalities is true:
* <ul>
* <li>{@code fromIndex < 0}</li>
* <li>{@code fromIndex > toIndex}</li>
* <li>{@code toIndex > length}</li>
* <li>{@code length < 0}, which is implied from the former inequalities</li>
* </ul>
*
* @param fromIndex the lower-bound (inclusive) of the sub-range
* @param toIndex the upper-bound (exclusive) of the sub-range
* @param length the upper-bound (exclusive) the range
* @return {@code fromIndex} if the sub-range within bounds of the range
* @throws IndexOutOfBoundsException if the sub-range is out of bounds
* @since 9
*/
public static
int checkFromToIndex(int fromIndex, int toIndex, int length) throws IndexOutOfBoundsException {
return checkFromToIndex(fromIndex, toIndex, length, null);
}
/**
* Checks if the sub-range from {@code fromIndex} (inclusive) to
* {@code toIndex} (exclusive) is within the bounds of range from {@code 0}
* (inclusive) to {@code length} (exclusive).
*
* <p>The sub-range is defined to be out of bounds if any of the following
* inequalities is true:
* <ul>
* <li>{@code fromIndex < 0}</li>
* <li>{@code fromIndex > toIndex}</li>
* <li>{@code toIndex > length}</li>
* <li>{@code length < 0}, which is implied from the former inequalities</li>
* </ul>
*
* <p>If the sub-range is out of bounds, then a runtime exception is thrown
* that is the result of applying the arguments {@code fromIndex} and
* {@code toIndex} to the given exception mapping function.
*
* @param <T> the type of runtime exception to throw if the arguments are
* out of bounds
* @param fromIndex the lower-bound (inclusive) of the sub-range
* @param toIndex the upper-bound (exclusive) of the sub-range
* @param length the upper-bound (exclusive) the range
* @param oobe the exception mapping function that when applied with out
* of bounds arguments returns a runtime exception. If {@code null}
* then, it's as if an exception mapping function was supplied that
* returns {@link IndexOutOfBoundsException} for any given arguments.
* @return {@code fromIndex} if the sub-range within bounds of the range
* @throws T if the sub-range is out of bounds, then a runtime exception is
* thrown that is the result of applying the out of bounds arguments
* to the exception mapping function.
* @throws IndexOutOfBoundsException if the sub-range is out of bounds and
* the exception mapping function is {@code null}
* @since 9
*/
public static <T extends RuntimeException>
int checkFromToIndex(int fromIndex, int toIndex, int length,
BiFunction<Integer, Integer, T> oobe) throws T, IndexOutOfBoundsException {
if (fromIndex < 0 || fromIndex > toIndex || toIndex > length)
throw outOfBounds(fromIndex, toIndex, oobe);
return fromIndex;
}
/**
* Checks if the sub-range from {@code fromIndex} (inclusive) to
* {@code fromIndex + size} (exclusive) is within the bounds of range from
* {@code 0} (inclusive) to {@code length} (exclusive).
*
* <p>The sub-range is defined to be out of bounds if any of the following
* inequalities is true:
* <ul>
* <li>{@code fromIndex < 0}</li>
* <li>{@code size < 0}</li>
* <li>{@code fromIndex + size > length}, taking into account integer overflow</li>
* <li>{@code length < 0}, which is implied from the former inequalities</li>
* </ul>
*
* @param fromIndex the lower-bound (inclusive) of the sub-interval
* @param size the size of the sub-range
* @param length the upper-bound (exclusive) of the range
* @return {@code fromIndex} if the sub-range within bounds of the range
* @throws IndexOutOfBoundsException if the sub-range is out of bounds
* @since 9
*/
public static
int checkFromIndexSize(int fromIndex, int size, int length) throws IndexOutOfBoundsException {
return checkFromIndexSize(fromIndex, size, length, null);
}
/**
* Checks if the sub-range from {@code fromIndex} (inclusive) to
* {@code fromIndex + size} (exclusive) is within the bounds of range from
* {@code 0} (inclusive) to {@code length} (exclusive).
*
* <p>The sub-range is defined to be out of bounds if any of the following
* inequalities is true:
* <ul>
* <li>{@code fromIndex < 0}</li>
* <li>{@code size < 0}</li>
* <li>{@code fromIndex + size > length}, taking into account integer overflow</li>
* <li>{@code length < 0}, which is implied from the former inequalities</li>
* </ul>
*
* <p>If the sub-range is out of bounds then, a runtime exception is thrown
* that is the result of applying the arguments {@code fromIndex} and
* {@code size} to the given exception mapping function.
*
* @param <T> the type of runtime exception to throw if the arguments are
* out of bounds
* @param fromIndex the lower-bound (inclusive) of the sub-interval
* @param size the size of the sub-range
* @param length the upper-bound (exclusive) of the range
* @param oobe the exception mapping function that when applied with out
* of bounds arguments returns a runtime exception. If {@code null}
* then, it's as if an exception mapping function was supplied that
* returns {@link IndexOutOfBoundsException} for any given arguments.
* @return {@code fromIndex} if the sub-range within bounds of the range
* @throws T if the sub-range is out of bounds, then a runtime exception is
* thrown that is the result of applying the out of bounds arguments
* to the exception mapping function.
* @throws IndexOutOfBoundsException if the sub-range is out of bounds and
* the exception mapping function is {@code null}
* @since 9
*/
public static <T extends RuntimeException>
int checkFromIndexSize(int fromIndex, int size, int length,
BiFunction<Integer, Integer, T> oobe) throws T, IndexOutOfBoundsException {
if ((length | fromIndex | size) < 0 || size > length - fromIndex)
throw outOfBounds(fromIndex, size, oobe);
return fromIndex;
}
} }

@ -37,7 +37,6 @@ import java.security.cert.Certificate;
import java.security.AccessController; import java.security.AccessController;
import java.security.CodeSource; import java.security.CodeSource;
import jdk.internal.misc.SharedSecrets; import jdk.internal.misc.SharedSecrets;
import sun.misc.IOUtils;
import sun.security.action.GetPropertyAction; import sun.security.action.GetPropertyAction;
import sun.security.util.ManifestEntryVerifier; import sun.security.util.ManifestEntryVerifier;
import sun.security.util.SignatureFileVerifier; import sun.security.util.SignatureFileVerifier;
@ -438,7 +437,12 @@ class JarFile extends ZipFile {
*/ */
private byte[] getBytes(ZipEntry ze) throws IOException { private byte[] getBytes(ZipEntry ze) throws IOException {
try (InputStream is = super.getInputStream(ze)) { try (InputStream is = super.getInputStream(ze)) {
return IOUtils.readFully(is, (int)ze.getSize(), true); int len = (int)ze.getSize();
byte[] b = is.readAllBytes();
if (len != -1 && b.length != len)
throw new EOFException("Expected:" + len + ", read:" + b.length);
return b;
} }
} }

@ -25,10 +25,10 @@
package sun.invoke.anon; package sun.invoke.anon;
import java.io.EOFException;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import sun.misc.IOUtils;
/** /**
* Anonymous class loader. Will load any valid classfile, producing * Anonymous class loader. Will load any valid classfile, producing
@ -225,6 +225,10 @@ public class AnonymousClassLoader {
if (contentLength < 0) if (contentLength < 0)
throw new IOException("invalid content length "+contentLength); throw new IOException("invalid content length "+contentLength);
return IOUtils.readFully(connection.getInputStream(), contentLength, true); byte[] b = connection.getInputStream().readAllBytes();
if (b.length != contentLength)
throw new EOFException("Expected:" + contentLength + ", read:" + b.length);
return b;
} }
} }

@ -25,6 +25,7 @@
package sun.reflect.misc; package sun.reflect.misc;
import java.io.EOFException;
import java.security.AllPermission; import java.security.AllPermission;
import java.security.AccessController; import java.security.AccessController;
import java.security.PermissionCollection; import java.security.PermissionCollection;
@ -43,7 +44,6 @@ import java.lang.reflect.Modifier;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import sun.misc.IOUtils;
class Trampoline { class Trampoline {
@ -368,15 +368,12 @@ public final class MethodUtil extends SecureClassLoader {
} }
} }
int len = uc.getContentLength(); int len = uc.getContentLength();
InputStream in = new BufferedInputStream(uc.getInputStream()); try (InputStream in = new BufferedInputStream(uc.getInputStream())) {
byte[] b = in.readAllBytes();
byte[] b; if (len != -1 && b.length != len)
try { throw new EOFException("Expected:" + len + ", read:" + b.length);
b = IOUtils.readFully(in, len, true); return b;
} finally {
in.close();
} }
return b;
} }

@ -33,7 +33,6 @@ import java.security.cert.CertificateFactory;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.util.*; import java.util.*;
import sun.misc.IOUtils;
import sun.security.pkcs.EncryptedPrivateKeyInfo; import sun.security.pkcs.EncryptedPrivateKeyInfo;
import sun.security.util.PolicyUtil; import sun.security.util.PolicyUtil;

@ -32,9 +32,9 @@ import java.security.cert.CertificateFactory;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.util.*; import java.util.*;
import sun.misc.IOUtils;
import sun.security.pkcs.EncryptedPrivateKeyInfo; import sun.security.pkcs.EncryptedPrivateKeyInfo;
import sun.security.pkcs12.PKCS12KeyStore; import sun.security.pkcs12.PKCS12KeyStore;
import sun.security.util.IOUtils;
import sun.security.util.KeyStoreDelegator; import sun.security.util.KeyStoreDelegator;
/** /**

@ -27,13 +27,13 @@ package sun.security.timestamp;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
import java.io.DataOutputStream; import java.io.DataOutputStream;
import java.io.EOFException;
import java.io.IOException; import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.net.URL; import java.net.URL;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.util.*; import java.util.*;
import sun.misc.IOUtils;
import sun.security.util.Debug; import sun.security.util.Debug;
/** /**
@ -147,8 +147,11 @@ public class HttpTimestamper implements Timestamper {
} }
verifyMimeType(connection.getContentType()); verifyMimeType(connection.getContentType());
int contentLength = connection.getContentLength(); int clen = connection.getContentLength();
replyBuffer = IOUtils.readFully(input, contentLength, false); replyBuffer = input.readAllBytes();
if (clen != -1 && replyBuffer.length != clen)
throw new EOFException("Expected:" + clen +
", read:" + replyBuffer.length);
if (debug != null) { if (debug != null) {
debug.println("received timestamp response (length=" + debug.println("received timestamp response (length=" +

@ -28,7 +28,6 @@ package sun.security.util;
import java.io.*; import java.io.*;
import java.math.BigInteger; import java.math.BigInteger;
import java.util.Date; import java.util.Date;
import sun.misc.IOUtils;
/** /**
* Represents a single DER-encoded value. DER encoding rules are a subset * Represents a single DER-encoded value. DER encoding rules are a subset

@ -27,7 +27,7 @@
* IOUtils: A collection of IO-related public static methods. * IOUtils: A collection of IO-related public static methods.
*/ */
package sun.misc; package sun.security.util;
import java.io.EOFException; import java.io.EOFException;
import java.io.IOException; import java.io.IOException;

@ -33,6 +33,7 @@ import java.net.URLConnection;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.io.EOFException;
import java.io.File; import java.io.File;
import java.io.FilePermission; import java.io.FilePermission;
import java.io.IOException; import java.io.IOException;
@ -51,7 +52,6 @@ import java.security.Permission;
import java.security.PermissionCollection; import java.security.PermissionCollection;
import sun.awt.AppContext; import sun.awt.AppContext;
import sun.awt.SunToolkit; import sun.awt.SunToolkit;
import sun.misc.IOUtils;
import sun.misc.ManagedLocalsThread; import sun.misc.ManagedLocalsThread;
import sun.net.www.ParseUtil; import sun.net.www.ParseUtil;
import sun.security.util.SecurityConstants; import sun.security.util.SecurityConstants;
@ -334,7 +334,9 @@ public class AppletClassLoader extends URLClassLoader {
byte[] b; byte[] b;
try { try {
b = IOUtils.readFully(in, len, true); b = in.readAllBytes();
if (len != -1 && b.length != len)
throw new EOFException("Expected:" + len + ", read:" + b.length);
} finally { } finally {
in.close(); in.close();
} }

@ -45,7 +45,6 @@ import javax.naming.ldap.Control;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.util.Arrays; import java.util.Arrays;
import sun.misc.IOUtils;
import javax.net.SocketFactory; import javax.net.SocketFactory;
/** /**
@ -862,7 +861,7 @@ public final class Connection implements Runnable {
} }
// read in seqlen bytes // read in seqlen bytes
byte[] left = IOUtils.readFully(in, seqlen, false); byte[] left = readFully(in, seqlen);
inbuf = Arrays.copyOf(inbuf, offset + left.length); inbuf = Arrays.copyOf(inbuf, offset + left.length);
System.arraycopy(left, 0, inbuf, offset, left.length); System.arraycopy(left, 0, inbuf, offset, left.length);
offset += left.length; offset += left.length;
@ -957,6 +956,31 @@ System.err.println("bytesread: " + bytesread);
} }
} }
private static byte[] readFully(InputStream is, int length)
throws IOException
{
byte[] buf = new byte[Math.min(length, 8192)];
int nread = 0;
while (nread < length) {
int bytesToRead;
if (nread >= buf.length) { // need to allocate a larger buffer
bytesToRead = Math.min(length - nread, buf.length + 8192);
if (buf.length < nread + bytesToRead) {
buf = Arrays.copyOf(buf, nread + bytesToRead);
}
} else {
bytesToRead = buf.length - nread;
}
int count = is.read(buf, nread, bytesToRead);
if (count < 0) {
if (buf.length != nread)
buf = Arrays.copyOf(buf, nread);
break;
}
nread += count;
}
return buf;
}
// This code must be uncommented to run the LdapAbandonTest. // This code must be uncommented to run the LdapAbandonTest.
/*public void sendSearchReqs(String dn, int numReqs) { /*public void sendSearchReqs(String dn, int numReqs) {

@ -31,10 +31,9 @@
package sun.security.krb5.internal; package sun.security.krb5.internal;
import sun.misc.IOUtils;
import java.io.*; import java.io.*;
import java.net.*; import java.net.*;
import sun.security.util.IOUtils;
public abstract class NetClient implements AutoCloseable { public abstract class NetClient implements AutoCloseable {
public static NetClient getInstance(String protocol, String hostname, int port, public static NetClient getInstance(String protocol, String hostname, int port,

@ -36,10 +36,10 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import sun.misc.IOUtils;
import sun.security.krb5.*; import sun.security.krb5.*;
import sun.security.krb5.internal.*; import sun.security.krb5.internal.*;
import sun.security.krb5.internal.util.KrbDataInputStream; import sun.security.krb5.internal.util.KrbDataInputStream;
import sun.security.util.IOUtils;
/** /**
* This class extends KrbDataInputStream. It is used for parsing FCC-format * This class extends KrbDataInputStream. It is used for parsing FCC-format

@ -106,9 +106,9 @@ public final class SunPKCS11 extends AuthProvider {
public Provider configure(String configArg) throws InvalidParameterException { public Provider configure(String configArg) throws InvalidParameterException {
final String newConfigName = checkNull(configArg); final String newConfigName = checkNull(configArg);
try { try {
return AccessController.doPrivileged(new PrivilegedExceptionAction<Provider>() { return AccessController.doPrivileged(new PrivilegedExceptionAction<>() {
@Override @Override
public Provider run() throws Exception { public SunPKCS11 run() throws Exception {
return new SunPKCS11(new Config(newConfigName)); return new SunPKCS11(new Config(newConfigName));
} }
}); });
@ -119,6 +119,11 @@ public final class SunPKCS11 extends AuthProvider {
} }
} }
@Override
public boolean isConfigured() {
return (config != null);
}
private static <T> T checkNull(T obj) { private static <T> T checkNull(T obj) {
if (obj == null) { if (obj == null) {
throw new NullPointerException(); throw new NullPointerException();
@ -1142,8 +1147,10 @@ public final class SunPKCS11 extends AuthProvider {
* @param handler the <code>CallbackHandler</code> used by * @param handler the <code>CallbackHandler</code> used by
* this provider to communicate with the caller * this provider to communicate with the caller
* *
* @exception LoginException if the login operation fails * @throws IllegalStateException if the provider requires configuration
* @exception SecurityException if the does not pass a security check for * and Provider.configure has not been called
* @throws LoginException if the login operation fails
* @throws SecurityException if the does not pass a security check for
* <code>SecurityPermission("authProvider.<i>name</i>")</code>, * <code>SecurityPermission("authProvider.<i>name</i>")</code>,
* where <i>name</i> is the value returned by * where <i>name</i> is the value returned by
* this provider's <code>getName</code> method * this provider's <code>getName</code> method
@ -1151,8 +1158,11 @@ public final class SunPKCS11 extends AuthProvider {
public void login(Subject subject, CallbackHandler handler) public void login(Subject subject, CallbackHandler handler)
throws LoginException { throws LoginException {
// security check if (!isConfigured()) {
throw new IllegalStateException("Configuration is required");
}
// security check
SecurityManager sm = System.getSecurityManager(); SecurityManager sm = System.getSecurityManager();
if (sm != null) { if (sm != null) {
if (debug != null) { if (debug != null) {
@ -1271,16 +1281,21 @@ public final class SunPKCS11 extends AuthProvider {
/** /**
* Log out from this provider * Log out from this provider
* *
* @exception LoginException if the logout operation fails * @throws IllegalStateException if the provider requires configuration
* @exception SecurityException if the does not pass a security check for * and Provider.configure has not been called
* @throws LoginException if the logout operation fails
* @throws SecurityException if the does not pass a security check for
* <code>SecurityPermission("authProvider.<i>name</i>")</code>, * <code>SecurityPermission("authProvider.<i>name</i>")</code>,
* where <i>name</i> is the value returned by * where <i>name</i> is the value returned by
* this provider's <code>getName</code> method * this provider's <code>getName</code> method
*/ */
public void logout() throws LoginException { public void logout() throws LoginException {
// security check if (!isConfigured()) {
throw new IllegalStateException("Configuration is required");
}
// security check
SecurityManager sm = System.getSecurityManager(); SecurityManager sm = System.getSecurityManager();
if (sm != null) { if (sm != null) {
sm.checkPermission sm.checkPermission
@ -1353,7 +1368,9 @@ public final class SunPKCS11 extends AuthProvider {
* @param handler a <code>CallbackHandler</code> for obtaining * @param handler a <code>CallbackHandler</code> for obtaining
* authentication information, which may be <code>null</code> * authentication information, which may be <code>null</code>
* *
* @exception SecurityException if the caller does not pass a * @throws IllegalStateException if the provider requires configuration
* and Provider.configure has not been called
* @throws SecurityException if the caller does not pass a
* security check for * security check for
* <code>SecurityPermission("authProvider.<i>name</i>")</code>, * <code>SecurityPermission("authProvider.<i>name</i>")</code>,
* where <i>name</i> is the value returned by * where <i>name</i> is the value returned by
@ -1361,8 +1378,11 @@ public final class SunPKCS11 extends AuthProvider {
*/ */
public void setCallbackHandler(CallbackHandler handler) { public void setCallbackHandler(CallbackHandler handler) {
// security check if (!isConfigured()) {
throw new IllegalStateException("Configuration is required");
}
// security check
SecurityManager sm = System.getSecurityManager(); SecurityManager sm = System.getSecurityManager();
if (sm != null) { if (sm != null) {
sm.checkPermission sm.checkPermission

@ -0,0 +1,192 @@
/*
* Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* 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.
*/
/**
* A transliteration of the "Freely Distributable Math Library"
* algorithms from C into Java. That is, this port of the algorithms
* is as close to the C originals as possible while still being
* readable legal Java.
*/
public class FdlibmTranslit {
private FdlibmTranslit() {
throw new UnsupportedOperationException("No FdLibmTranslit instances for you.");
}
/**
* Return the low-order 32 bits of the double argument as an int.
*/
private static int __LO(double x) {
long transducer = Double.doubleToRawLongBits(x);
return (int)transducer;
}
/**
* Return a double with its low-order bits of the second argument
* and the high-order bits of the first argument..
*/
private static double __LO(double x, int low) {
long transX = Double.doubleToRawLongBits(x);
return Double.longBitsToDouble((transX & 0xFFFF_FFFF_0000_0000L)|low );
}
/**
* Return the high-order 32 bits of the double argument as an int.
*/
private static int __HI(double x) {
long transducer = Double.doubleToRawLongBits(x);
return (int)(transducer >> 32);
}
/**
* Return a double with its high-order bits of the second argument
* and the low-order bits of the first argument..
*/
private static double __HI(double x, int high) {
long transX = Double.doubleToRawLongBits(x);
return Double.longBitsToDouble((transX & 0x0000_0000_FFFF_FFFFL)|( ((long)high)) << 32 );
}
public static double hypot(double x, double y) {
return Hypot.compute(x, y);
}
/**
* hypot(x,y)
*
* Method :
* If (assume round-to-nearest) z = x*x + y*y
* has error less than sqrt(2)/2 ulp, than
* sqrt(z) has error less than 1 ulp (exercise).
*
* So, compute sqrt(x*x + y*y) with some care as
* follows to get the error below 1 ulp:
*
* Assume x > y > 0;
* (if possible, set rounding to round-to-nearest)
* 1. if x > 2y use
* x1*x1 + (y*y + (x2*(x + x1))) for x*x + y*y
* where x1 = x with lower 32 bits cleared, x2 = x - x1; else
* 2. if x <= 2y use
* t1*y1 + ((x-y) * (x-y) + (t1*y2 + t2*y))
* where t1 = 2x with lower 32 bits cleared, t2 = 2x - t1,
* y1= y with lower 32 bits chopped, y2 = y - y1.
*
* NOTE: scaling may be necessary if some argument is too
* large or too tiny
*
* Special cases:
* hypot(x,y) is INF if x or y is +INF or -INF; else
* hypot(x,y) is NAN if x or y is NAN.
*
* Accuracy:
* hypot(x,y) returns sqrt(x^2 + y^2) with error less
* than 1 ulps (units in the last place)
*/
static class Hypot {
public static double compute(double x, double y) {
double a = x;
double b = y;
double t1, t2, y1, y2, w;
int j, k, ha, hb;
ha = __HI(x) & 0x7fffffff; // high word of x
hb = __HI(y) & 0x7fffffff; // high word of y
if(hb > ha) {
a = y;
b = x;
j = ha;
ha = hb;
hb = j;
} else {
a = x;
b = y;
}
a = __HI(a, ha); // a <- |a|
b = __HI(b, hb); // b <- |b|
if ((ha - hb) > 0x3c00000) {
return a + b; // x / y > 2**60
}
k=0;
if (ha > 0x5f300000) { // a>2**500
if (ha >= 0x7ff00000) { // Inf or NaN
w = a + b; // for sNaN
if (((ha & 0xfffff) | __LO(a)) == 0)
w = a;
if (((hb ^ 0x7ff00000) | __LO(b)) == 0)
w = b;
return w;
}
// scale a and b by 2**-600
ha -= 0x25800000;
hb -= 0x25800000;
k += 600;
a = __HI(a, ha);
b = __HI(b, hb);
}
if (hb < 0x20b00000) { // b < 2**-500
if (hb <= 0x000fffff) { // subnormal b or 0 */
if ((hb | (__LO(b))) == 0)
return a;
t1 = 0;
t1 = __HI(t1, 0x7fd00000); // t1=2^1022
b *= t1;
a *= t1;
k -= 1022;
} else { // scale a and b by 2^600
ha += 0x25800000; // a *= 2^600
hb += 0x25800000; // b *= 2^600
k -= 600;
a = __HI(a, ha);
b = __HI(b, hb);
}
}
// medium size a and b
w = a - b;
if (w > b) {
t1 = 0;
t1 = __HI(t1, ha);
t2 = a - t1;
w = Math.sqrt(t1*t1 - (b*(-b) - t2 * (a + t1)));
} else {
a = a + a;
y1 = 0;
y1 = __HI(y1, hb);
y2 = b - y1;
t1 = 0;
t1 = __HI(t1, ha + 0x00100000);
t2 = a - t1;
w = Math.sqrt(t1*y1 - (w*(-w) - (t1*y2 + t2*b)));
}
if (k != 0) {
t1 = 1.0;
int t1_hi = __HI(t1);
t1_hi += (k << 20);
t1 = __HI(t1, t1_hi);
return t1 * w;
} else
return w;
}
}
}

@ -24,10 +24,19 @@
/* /*
* @test * @test
* @bug 4851638 * @bug 4851638
* @key randomness
* @summary Tests for StrictMath.hypot * @summary Tests for StrictMath.hypot
* @library /lib/testlibrary/
* @build jdk.testlibrary.*
* @build Tests
* @build FdlibmTranslit
* @build HypotTests
* @run main HypotTests
* @author Joseph D. Darcy * @author Joseph D. Darcy
*/ */
import jdk.testlibrary.RandomFactory;
/** /**
* The tests in ../Math/HypotTests.java test properties that should * The tests in ../Math/HypotTests.java test properties that should
* hold for any hypot implementation, including the FDLIBM-based one * hold for any hypot implementation, including the FDLIBM-based one
@ -42,6 +51,19 @@
public class HypotTests { public class HypotTests {
private HypotTests(){} private HypotTests(){}
public static void main(String... args) {
int failures = 0;
failures += testHypot();
failures += testAgainstTranslit();
if (failures > 0) {
System.err.println("Testing hypot incurred "
+ failures + " failures.");
throw new RuntimeException();
}
}
/** /**
* The hypot implementation is commutative, {@code hypot(a, b) == * The hypot implementation is commutative, {@code hypot(a, b) ==
* hypot(b, a)}, and independent of sign, {@code hypot(a, b) == * hypot(b, a)}, and independent of sign, {@code hypot(a, b) ==
@ -663,6 +685,12 @@ public class HypotTests {
{0x1.0p-450, 0x1.fffffffffffffp-499, 0x1.0p-450}, {0x1.0p-450, 0x1.fffffffffffffp-499, 0x1.0p-450},
{0x1.0000000000001p-450, 0x1.fffffffffffffp-499, 0x1.0000000000001p-450}, {0x1.0000000000001p-450, 0x1.fffffffffffffp-499, 0x1.0000000000001p-450},
{0x1.00000_ffff_0000p500, 0x1.fffffffffffffp499, 0x1.6a09f1b837ccfp500},
{0x1.00000_0000_0001p500, 0x1.fffffffffffffp499, 0x1.6a09e667f3bcdp500},
{0x1.00000_ffff_ffffp500, 0x1.fffffffffffffp499, 0x1.6a09f1b8431d3p500},
{0x1.00001_0000_0000p500, 0x1.fffffffffffffp499, 0x1.6a09f1b8431d5p500},
// 0x1.0p-1022 is MIN_NORMAL // 0x1.0p-1022 is MIN_NORMAL
{0x1.0000000000001p-1022, 0x1.0000000000001p-1022, 0x1.6a09e667f3bcep-1022}, {0x1.0000000000001p-1022, 0x1.0000000000001p-1022, 0x1.6a09e667f3bcep-1022},
{0x1.0000000000001p-1022, 0x1.0p-1022, 0x1.6a09e667f3bcdp-1022}, {0x1.0000000000001p-1022, 0x1.0p-1022, 0x1.6a09e667f3bcdp-1022},
@ -686,15 +714,30 @@ public class HypotTests {
return failures; return failures;
} }
public static void main(String... args) { // Initialize shared random number generator
private static java.util.Random random = RandomFactory.getRandom();
/**
* Test StrictMath.hypot against transliteration port of hypot.
*/
private static int testAgainstTranslit() {
int failures = 0; int failures = 0;
double x = Tests.createRandomDouble(random);
double y = Tests.createRandomDouble(random);
failures += testHypot(); // Make the increment twice the ulp value in case the random
// value is near an exponent threshold.
double increment_x = 2.0 * Math.ulp(x);
double increment_y = 2.0 * Math.ulp(y);
if (failures > 0) { // Don't worry about x or y overflowing to infinity if their
System.err.println("Testing hypot incurred " // exponent is MAX_EXPONENT.
+ failures + " failures."); for (int i = 0; i < 200; i++, x += increment_x) {
throw new RuntimeException(); for (int j = 0; j < 200; j++, y += increment_y) {
failures += testHypotCase(x, y, FdlibmTranslit.hypot(x, y));
}
} }
return failures;
} }
} }

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * 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
@ -60,6 +60,16 @@ public class Tests {
return 0; return 0;
} }
/**
* Returns a double over the normalized range of floating-point values.
* @return a double over the normalized range of floating-point values
*/
static double createRandomDouble(java.util.Random random) {
final int EXPONENT_RANGE = Double.MAX_EXPONENT - Double.MIN_EXPONENT + 1;
int targetExponent = Double.MIN_EXPONENT + random.nextInt(EXPONENT_RANGE + 1);
double tmp = random.nextDouble(); // Double in the range of [0.0, 1.0)
int tmpExponent = Math.getExponent(tmp);
return Math.scalb(tmp, targetExponent - tmpExponent);
}
} }

@ -107,11 +107,11 @@ public class AddToReadOnlyPermissionCollection {
static void tryFilePC() throws Exception { static void tryFilePC() throws Exception {
try { try {
FilePermission p0 = new FilePermission("/home/foobar","read"); FilePermission p0 = new FilePermission("/tmp/foobar","read");
PermissionCollection pc = p0.newPermissionCollection(); PermissionCollection pc = p0.newPermissionCollection();
pc.setReadOnly(); // this should lock out future adds pc.setReadOnly(); // this should lock out future adds
// //
FilePermission p1 = new FilePermission("/home/quux","read"); FilePermission p1 = new FilePermission("/tmp/quux","read");
pc.add(p1); pc.add(p1);
throw new throw new
Exception("Failed...FilePermission added to readonly FilePermissionCollection."); Exception("Failed...FilePermission added to readonly FilePermissionCollection.");

@ -166,9 +166,9 @@ public class Concurrent {
new AllPermission(), new AllPermission()}; new AllPermission(), new AllPermission()};
private static final Permission[] filep = new Permission[]{ private static final Permission[] filep = new Permission[]{
new FilePermission("/home/foobar", "read"), new FilePermission("/tmp/foobar", "read"),
new FilePermission("/home/foo", "write"), new FilePermission("/tmp/foo", "write"),
new FilePermission("/home/foobar", "read,write"), new FilePermission("/tmp/foobar", "read,write"),
}; };
private static final Permission[] sockp = new Permission[]{ private static final Permission[] sockp = new Permission[]{

@ -50,9 +50,9 @@ public class PermissionCollectionStreamTest extends OpTestCase {
{ {
"FilePermission", "FilePermission",
new Permission[]{ new Permission[]{
new FilePermission("/home/foobar", "read"), new FilePermission("/tmp/foobar", "read"),
new FilePermission("/home/foo", "write"), new FilePermission("/tmp/foo", "write"),
new FilePermission("/home/foobar", "read,write"), new FilePermission("/tmp/foobar", "read,write"),
} }
}, },
}; };

@ -0,0 +1,219 @@
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @summary IndexOutOfBoundsException check index tests
* @run testng CheckIndex
* @bug 8135248
*/
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.IntSupplier;
import static org.testng.Assert.*;
public class CheckIndex {
static class AssertingOutOfBoundsException extends RuntimeException {
}
static BiFunction<Integer, Integer, AssertingOutOfBoundsException> assertingOutOfBounds(
int expFromIndex, int expToIndexOrSizeOrLength) {
return (fromIndex, toIndexOrSizeorLength) -> {
assertEquals(fromIndex, Integer.valueOf(expFromIndex));
assertEquals(toIndexOrSizeorLength, Integer.valueOf(expToIndexOrSizeOrLength));
return new AssertingOutOfBoundsException();
};
}
static final int[] VALUES = {0, 1, Integer.MAX_VALUE - 1, Integer.MAX_VALUE, -1, Integer.MIN_VALUE + 1, Integer.MIN_VALUE};
@DataProvider
static Object[][] checkIndexProvider() {
List<Object[]> l = new ArrayList<>();
for (int index : VALUES) {
for (int length : VALUES) {
boolean withinBounds = index >= 0 &&
length >= 0 &&
index < length;
l.add(new Object[]{index, length, withinBounds});
}
}
return l.toArray(new Object[0][0]);
}
interface X {
int apply(int a, int b, int c);
}
@Test(dataProvider = "checkIndexProvider")
public void testCheckIndex(int index, int length, boolean withinBounds) {
BiConsumer<Class<? extends RuntimeException>, IntSupplier> check = (ec, s) -> {
try {
int rIndex = s.getAsInt();
if (!withinBounds)
fail(String.format(
"Index %d is out of bounds of [0, %d), but was reported to be within bounds", index, length));
assertEquals(rIndex, index);
}
catch (RuntimeException e) {
assertTrue(ec.isInstance(e));
if (withinBounds)
fail(String.format(
"Index %d is within bounds of [0, %d), but was reported to be out of bounds", index, length));
}
};
check.accept(AssertingOutOfBoundsException.class,
() -> Objects.checkIndex(index, length, assertingOutOfBounds(index, length)));
check.accept(IndexOutOfBoundsException.class,
() -> Objects.checkIndex(index, length, null));
check.accept(IndexOutOfBoundsException.class,
() -> Objects.checkIndex(index, length));
}
@DataProvider
static Object[][] checkFromToIndexProvider() {
List<Object[]> l = new ArrayList<>();
for (int fromIndex : VALUES) {
for (int toIndex : VALUES) {
for (int length : VALUES) {
boolean withinBounds = fromIndex >= 0 &&
toIndex >= 0 &&
length >= 0 &&
fromIndex <= toIndex &&
toIndex <= length;
l.add(new Object[]{fromIndex, toIndex, length, withinBounds});
}
}
}
return l.toArray(new Object[0][0]);
}
@Test(dataProvider = "checkFromToIndexProvider")
public void testCheckFromToIndex(int fromIndex, int toIndex, int length, boolean withinBounds) {
BiConsumer<Class<? extends RuntimeException>, IntSupplier> check = (ec, s) -> {
try {
int rIndex = s.getAsInt();
if (!withinBounds)
fail(String.format(
"Range [%d, %d) is out of bounds of [0, %d), but was reported to be withing bounds", fromIndex, toIndex, length));
assertEquals(rIndex, fromIndex);
}
catch (RuntimeException e) {
assertTrue(ec.isInstance(e));
if (withinBounds)
fail(String.format(
"Range [%d, %d) is within bounds of [0, %d), but was reported to be out of bounds", fromIndex, toIndex, length));
}
};
check.accept(AssertingOutOfBoundsException.class,
() -> Objects.checkFromToIndex(fromIndex, toIndex, length, assertingOutOfBounds(fromIndex, toIndex)));
check.accept(IndexOutOfBoundsException.class,
() -> Objects.checkFromToIndex(fromIndex, toIndex, length, null));
check.accept(IndexOutOfBoundsException.class,
() -> Objects.checkFromToIndex(fromIndex, toIndex, length));
}
@DataProvider
static Object[][] checkFromIndexSizeProvider() {
List<Object[]> l = new ArrayList<>();
for (int fromIndex : VALUES) {
for (int size : VALUES) {
for (int length : VALUES) {
// Explicitly convert to long
long lFromIndex = fromIndex;
long lSize = size;
long lLength = length;
// Avoid overflow
long lToIndex = lFromIndex + lSize;
boolean withinBounds = lFromIndex >= 0L &&
lSize >= 0L &&
lLength >= 0L &&
lFromIndex <= lToIndex &&
lToIndex <= lLength;
l.add(new Object[]{fromIndex, size, length, withinBounds});
}
}
}
return l.toArray(new Object[0][0]);
}
@Test(dataProvider = "checkFromIndexSizeProvider")
public void testCheckFromIndexSize(int fromIndex, int size, int length, boolean withinBounds) {
BiConsumer<Class<? extends RuntimeException>, IntSupplier> check = (ec, s) -> {
try {
int rIndex = s.getAsInt();
if (!withinBounds)
fail(String.format(
"Range [%d, %d + %d) is out of bounds of [0, %d), but was reported to be withing bounds", fromIndex, fromIndex, size, length));
assertEquals(rIndex, fromIndex);
}
catch (RuntimeException e) {
assertTrue(ec.isInstance(e));
if (withinBounds)
fail(String.format(
"Range [%d, %d + %d) is within bounds of [0, %d), but was reported to be out of bounds", fromIndex, fromIndex, size, length));
}
};
check.accept(AssertingOutOfBoundsException.class,
() -> Objects.checkFromIndexSize(fromIndex, size, length, assertingOutOfBounds(fromIndex, size)));
check.accept(IndexOutOfBoundsException.class,
() -> Objects.checkFromIndexSize(fromIndex, size, length, null));
check.accept(IndexOutOfBoundsException.class,
() -> Objects.checkFromIndexSize(fromIndex, size, length));
}
@Test
public void checkIndexOutOfBoundsExceptionConstructors() {
BiConsumer<Class<? extends RuntimeException>, IntSupplier> check = (ec, s) -> {
try {
s.getAsInt();
fail("Runtime exception expected");
}
catch (RuntimeException e) {
assertTrue(ec.isInstance(e));
}
};
check.accept(IndexOutOfBoundsException.class,
() -> Objects.checkIndex(1, 0, IndexOutOfBoundsException::new));
check.accept(StringIndexOutOfBoundsException.class,
() -> Objects.checkIndex(1, 0, StringIndexOutOfBoundsException::new));
check.accept(ArrayIndexOutOfBoundsException.class,
() -> Objects.checkIndex(1, 0, ArrayIndexOutOfBoundsException::new));
}
}

@ -0,0 +1,78 @@
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
import java.io.*;
import java.util.*;
import java.security.*;
import javax.security.auth.callback.*;
/**
* @test
* @bug 8130648
* @summary make sure IllegalStateException is thrown for uninitialized
* SunPKCS11 provider instance
*/
public class LoginISE {
public static void main(String[] args) throws Exception {
Provider p = Security.getProvider("SunPKCS11");
if (p == null) {
System.out.println("No un-initialized PKCS11 provider available; skip");
return;
}
if (!(p instanceof AuthProvider)) {
throw new RuntimeException("Error: expect AuthProvider!");
}
AuthProvider ap = (AuthProvider) p;
if (ap.isConfigured()) {
throw new RuntimeException("Fail: isConfigured() should return false");
}
try {
ap.login(null, null);
throw new RuntimeException("Fail: expected ISE not thrown!");
} catch (IllegalStateException ise) {
System.out.println("Expected ISE thrown for login call");
}
try {
ap.logout();
throw new RuntimeException("Fail: expected ISE not thrown!");
} catch (IllegalStateException ise) {
System.out.println("Expected ISE thrown for logout call");
}
try {
ap.setCallbackHandler(new PasswordCallbackHandler());
throw new RuntimeException("Fail: expected ISE not thrown!");
} catch (IllegalStateException ise) {
System.out.println("Expected ISE thrown for logout call");
}
System.out.println("Test Passed");
}
public static class PasswordCallbackHandler implements CallbackHandler {
public void handle(Callback[] callbacks)
throws IOException, UnsupportedCallbackException {
}
}
}

@ -39,7 +39,7 @@ public class CombinedPerms {
String host = "localhost"; String host = "localhost";
URL u = new URL("file:/home/duke"); URL u = new URL("file:/tmp/duke");
CodeSource cs = CodeSource cs =
new CodeSource(u, (java.security.cert.Certificate[]) null); new CodeSource(u, (java.security.cert.Certificate[]) null);
Permissions p = new Permissions(); Permissions p = new Permissions();

@ -1,3 +1,3 @@
grant codebase "file:/home/duke" { grant codebase "file:/tmp/duke" {
permission java.net.SocketPermission "localhost", "accept"; permission java.net.SocketPermission "localhost", "accept";
}; };

@ -40,7 +40,6 @@ import java.util.Calendar;
import java.util.jar.JarEntry; import java.util.jar.JarEntry;
import java.util.jar.JarFile; import java.util.jar.JarFile;
import sun.misc.IOUtils;
import sun.security.pkcs.ContentInfo; import sun.security.pkcs.ContentInfo;
import sun.security.pkcs.PKCS7; import sun.security.pkcs.PKCS7;
import sun.security.pkcs.PKCS9Attribute; import sun.security.pkcs.PKCS9Attribute;
@ -343,7 +342,7 @@ public class TimestampCheck {
try (JarFile jf = new JarFile(file)) { try (JarFile jf = new JarFile(file)) {
JarEntry je = jf.getJarEntry("META-INF/OLD.RSA"); JarEntry je = jf.getJarEntry("META-INF/OLD.RSA");
try (InputStream is = jf.getInputStream(je)) { try (InputStream is = jf.getInputStream(je)) {
byte[] content = IOUtils.readFully(is, -1, true); byte[] content = is.readAllBytes();
PKCS7 p7 = new PKCS7(content); PKCS7 p7 = new PKCS7(content);
SignerInfo[] si = p7.getSignerInfos(); SignerInfo[] si = p7.getSignerInfos();
if (si == null || si.length == 0) { if (si == null || si.length == 0) {

@ -25,13 +25,11 @@
* @test * @test
* @bug 6864911 * @bug 6864911
* @summary ASN.1/DER input stream parser needs more work * @summary ASN.1/DER input stream parser needs more work
* @modules java.base/sun.misc * @modules java.base/sun.security.util
* java.base/sun.security.util
*/ */
import java.io.*; import java.io.*;
import sun.security.util.*; import sun.security.util.*;
import sun.misc.IOUtils;
public class BadValue { public class BadValue {

@ -327,3 +327,4 @@ ead8b7192f00417185f0e64d0cb332f0f8ad4ae1 jdk9-b81
d68904d5a00e7e6c714e11f7ec9d0689af959d79 jdk9-b82 d68904d5a00e7e6c714e11f7ec9d0689af959d79 jdk9-b82
6b3b94a2ebca4a99b2effefb2a1556cee954fd2f jdk9-b83 6b3b94a2ebca4a99b2effefb2a1556cee954fd2f jdk9-b83
e3445ccab58f741801021dec9aa46e7f2c09efd9 jdk9-b84 e3445ccab58f741801021dec9aa46e7f2c09efd9 jdk9-b84
7ef2c66892a3af15540c2800104c660c4f7f45e9 jdk9-b85

@ -3733,17 +3733,17 @@ public class Attr extends JCTree.Visitor {
" in tree " + tree); " in tree " + tree);
} }
// Test (1): emit a `deprecation' warning if symbol is deprecated. // Emit a `deprecation' warning if symbol is deprecated.
// (for constructors, the error was given when the constructor was // (for constructors (but not for constructor references), the error
// resolved) // was given when the constructor was resolved)
if (sym.name != names.init) { if (sym.name != names.init || tree.hasTag(REFERENCE)) {
chk.checkDeprecated(tree.pos(), env.info.scope.owner, sym); chk.checkDeprecated(tree.pos(), env.info.scope.owner, sym);
chk.checkSunAPI(tree.pos(), sym); chk.checkSunAPI(tree.pos(), sym);
chk.checkProfile(tree.pos(), sym); chk.checkProfile(tree.pos(), sym);
} }
// Test (3): if symbol is a variable, check that its type and // If symbol is a variable, check that its type and
// kind are compatible with the prototype and protokind. // kind are compatible with the prototype and protokind.
return check(tree, owntype, sym.kind.toSelector(), resultInfo); return check(tree, owntype, sym.kind.toSelector(), resultInfo);
} }

@ -290,6 +290,13 @@ public class Resolve {
} }
public boolean isAccessible(Env<AttrContext> env, TypeSymbol c, boolean checkInner) { public boolean isAccessible(Env<AttrContext> env, TypeSymbol c, boolean checkInner) {
/* 15.9.5.1: Note that it is possible for the signature of the anonymous constructor
to refer to an inaccessible type
*/
if (env.enclMethod != null && (env.enclMethod.mods.flags & ANONCONSTR) != 0)
return true;
boolean isAccessible = false; boolean isAccessible = false;
switch ((short)(c.flags() & AccessFlags)) { switch ((short)(c.flags() & AccessFlags)) {
case PRIVATE: case PRIVATE:
@ -301,13 +308,7 @@ public class Resolve {
isAccessible = isAccessible =
env.toplevel.packge == c.owner // fast special case env.toplevel.packge == c.owner // fast special case
|| ||
env.toplevel.packge == c.packge() env.toplevel.packge == c.packge();
||
// Hack: this case is added since synthesized default constructors
// of anonymous classes should be allowed to access
// classes which would be inaccessible otherwise.
env.enclMethod != null &&
(env.enclMethod.mods.flags & ANONCONSTR) != 0;
break; break;
default: // error recovery default: // error recovery
case PUBLIC: case PUBLIC:
@ -361,6 +362,13 @@ public class Resolve {
} }
public boolean isAccessible(Env<AttrContext> env, Type site, Symbol sym, boolean checkInner) { public boolean isAccessible(Env<AttrContext> env, Type site, Symbol sym, boolean checkInner) {
if (sym.name == names.init && sym.owner != site.tsym) return false; if (sym.name == names.init && sym.owner != site.tsym) return false;
/* 15.9.5.1: Note that it is possible for the signature of the anonymous constructor
to refer to an inaccessible type
*/
if (env.enclMethod != null && (env.enclMethod.mods.flags & ANONCONSTR) != 0)
return true;
switch ((short)(sym.flags() & AccessFlags)) { switch ((short)(sym.flags() & AccessFlags)) {
case PRIVATE: case PRIVATE:
return return
@ -2426,7 +2434,9 @@ public class Resolve {
return spMethod; return spMethod;
} }
}; };
polymorphicSignatureScope.enter(msym); if (!mtype.isErroneous()) { // Cache only if kosher.
polymorphicSignatureScope.enter(msym);
}
return msym; return msym;
} }

@ -0,0 +1,45 @@
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8075799
*
* @summary Extraneous access checks implemented by javac
* @compile CtorAccessBypassTest.java
* @run main CtorAccessBypassTest
*
*/
public class CtorAccessBypassTest {
public static void main(String[] args) {
new CtorAccessBypassTest_01<Object>(null) {};
new CtorAccessBypassTest_01<>(null) {};
}
}
class CtorAccessBypassTest_01<T> {
private class Private {}
CtorAccessBypassTest_01(Private p) {
}
}

@ -1,3 +1,3 @@
Neg18.java:14:21: compiler.err.prob.found.req: (compiler.misc.cant.apply.diamond.1: (compiler.misc.diamond: pkg.Neg18_01), (compiler.misc.inaccessible.varargs.type: pkg.Neg18_01.PkgPrivate, kindname.class, Neg18)) Neg18.java:14:21: compiler.err.prob.found.req: (compiler.misc.cant.apply.diamond.1: (compiler.misc.diamond: pkg.Neg18_01), (compiler.misc.inaccessible.varargs.type: pkg.Neg18_01.PkgPrivate, kindname.class, Neg18))
Neg18.java:14:26: compiler.err.not.def.public.cant.access: pkg.Neg18_01.PkgPrivate, pkg.Neg18_01 Neg18.java:14:9: compiler.err.cant.apply.symbol: kindname.constructor, , pkg.Neg18_01.PkgPrivate[], compiler.misc.no.args, kindname.class, compiler.misc.anonymous.class: <any>, (compiler.misc.inaccessible.varargs.type: pkg.Neg18_01.PkgPrivate, kindname.class, Neg18)
2 errors 2 errors

@ -0,0 +1,49 @@
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @bug 8130506
* @summary javac AssertionError when invoking MethodHandle.invoke with lambda paramterer
* @run main MethodHandleInvokeTest
*/
import java.lang.invoke.MethodHandle;
public class MethodHandleInvokeTest {
private static interface Obj2Obj {
Object run(Object obj) throws Throwable;
}
private static void m(Obj2Obj param) {
}
public static void main(String[] args) {
m((obj) -> {
MethodHandle mhandle = null;
mhandle.invoke(obj);
return null;
});
}
}

@ -0,0 +1,47 @@
/**
* @test /nodynamiccopyright/
* @bug 8065219
* @summary Deprecated warning in method reference are missing in some cases.
* @compile/ref=DeprecationSE8Test.noLint.out -XDrawDiagnostics DeprecationSE8Test.java
* @compile/ref=DeprecationSE8Test.out -Xlint:deprecation,-options -source 8 -XDrawDiagnostics DeprecationSE8Test.java
*/
class DeprecationSE8Test {
@FunctionalInterface
interface I {
DeprecationSE8Test meth();
}
@FunctionalInterface
interface J {
int meth();
}
@Deprecated
public DeprecationSE8Test() {
}
@Deprecated
public static int foo() {
return 1;
}
// Using deprecated entities from within one's own top level class does not merit warning.
void notBadUsages() {
I i = DeprecationSE8Test::new;
new DeprecationSE8Test();
J j = DeprecationSE8Test::foo;
foo();
}
}
class DeprecationSE8_01 {
// Using deprecated entities from outside one's own top level class deserves warning.
void badUsages() {
DeprecationSE8Test.I i = DeprecationSE8Test::new;
new DeprecationSE8Test();
DeprecationSE8Test.foo();
DeprecationSE8Test.J j = DeprecationSE8Test::foo;
}
}

@ -0,0 +1,2 @@
- compiler.note.deprecated.filename: DeprecationSE8Test.java
- compiler.note.deprecated.recompile

@ -0,0 +1,5 @@
DeprecationSE8Test.java:42:34: compiler.warn.has.been.deprecated: DeprecationSE8Test(), DeprecationSE8Test
DeprecationSE8Test.java:43:9: compiler.warn.has.been.deprecated: DeprecationSE8Test(), DeprecationSE8Test
DeprecationSE8Test.java:44:27: compiler.warn.has.been.deprecated: foo(), DeprecationSE8Test
DeprecationSE8Test.java:45:34: compiler.warn.has.been.deprecated: foo(), DeprecationSE8Test
4 warnings

@ -287,7 +287,7 @@ else # HAS_SPEC=true
$(call StartGlobalTimer) $(call StartGlobalTimer)
$(call PrepareSmartJavac) $(call PrepareSmartJavac)
( cd $(TOPDIR) && \ ( cd $(TOPDIR) && \
$(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) $(OUTPUT_SYNC_FLAG) \ $(BUILD_LOG_WRAPPER) $(NICE) $(MAKE) $(MAKE_ARGS) $(OUTPUT_SYNC_FLAG) \
-j $(JOBS) -f make/Main.gmk $(USER_MAKE_VARS) \ -j $(JOBS) -f make/Main.gmk $(USER_MAKE_VARS) \
$(PARALLEL_TARGETS) $(COMPARE_BUILD_MAKE) || \ $(PARALLEL_TARGETS) $(COMPARE_BUILD_MAKE) || \
( exitcode=$$? && $(BUILD_LOG_WRAPPER) \ ( exitcode=$$? && $(BUILD_LOG_WRAPPER) \

@ -318,3 +318,4 @@ ab231613d7206431ba31917a02e7cedd70e88e70 jdk9-b76
8bab0a9d8a638affdd680c5ec783373f71c19267 jdk9-b82 8bab0a9d8a638affdd680c5ec783373f71c19267 jdk9-b82
21b86b980a5f0d27f1f758a3e4818d3331387172 jdk9-b83 21b86b980a5f0d27f1f758a3e4818d3331387172 jdk9-b83
214b97ba911f4d768c0214098739e32ab54c8503 jdk9-b84 214b97ba911f4d768c0214098739e32ab54c8503 jdk9-b84
285628dac94332d95979de365630c93ab8fa9962 jdk9-b85

@ -103,27 +103,14 @@ import jdk.internal.dynalink.support.Lookup;
* handle is always at the start of the chain. * handle is always at the start of the chain.
*/ */
public class ChainedCallSite extends AbstractRelinkableCallSite { public class ChainedCallSite extends AbstractRelinkableCallSite {
private static final MethodHandle PRUNE_CATCHES = private static final MethodHandle PRUNE_CATCHES;
MethodHandles.insertArguments( private static final MethodHandle PRUNE_SWITCHPOINTS;
Lookup.findOwnSpecial( static {
MethodHandles.lookup(), final MethodHandle PRUNE = Lookup.findOwnSpecial(MethodHandles.lookup(), "prune", MethodHandle.class,
"prune", MethodHandle.class, boolean.class);
MethodHandle.class, PRUNE_CATCHES = MethodHandles.insertArguments(PRUNE, 2, true);
MethodHandle.class, PRUNE_SWITCHPOINTS = MethodHandles.insertArguments(PRUNE, 2, false);
boolean.class), }
2,
true);
private static final MethodHandle PRUNE_SWITCHPOINTS =
MethodHandles.insertArguments(
Lookup.findOwnSpecial(
MethodHandles.lookup(),
"prune",
MethodHandle.class,
MethodHandle.class,
boolean.class),
2,
false);
private final AtomicReference<LinkedList<GuardedInvocation>> invocations = new AtomicReference<>(); private final AtomicReference<LinkedList<GuardedInvocation>> invocations = new AtomicReference<>();
@ -181,8 +168,8 @@ public class ChainedCallSite extends AbstractRelinkableCallSite {
// prune-and-invoke is used as the fallback for invalidated switchpoints. If a switchpoint gets invalidated, we // prune-and-invoke is used as the fallback for invalidated switchpoints. If a switchpoint gets invalidated, we
// rebuild the chain and get rid of all invalidated switchpoints instead of letting them linger. // rebuild the chain and get rid of all invalidated switchpoints instead of letting them linger.
final MethodHandle pruneAndInvokeSwitchPoints = makePruneAndInvokeMethod(relink, getPruneSwitchpoints()); final MethodHandle pruneAndInvokeSwitchPoints = makePruneAndInvokeMethod(relink, PRUNE_SWITCHPOINTS);
final MethodHandle pruneAndInvokeCatches = makePruneAndInvokeMethod(relink, getPruneCatches()); final MethodHandle pruneAndInvokeCatches = makePruneAndInvokeMethod(relink, PRUNE_CATCHES);
// Fold the new chain // Fold the new chain
MethodHandle target = relink; MethodHandle target = relink;
@ -199,22 +186,6 @@ public class ChainedCallSite extends AbstractRelinkableCallSite {
return target; return target;
} }
/**
* Get the switchpoint pruning function for a chained call site
* @return function that removes invalidated switchpoints tied to callsite guard chain and relinks
*/
protected MethodHandle getPruneSwitchpoints() {
return PRUNE_SWITCHPOINTS;
}
/**
* Get the catch pruning function for a chained call site
* @return function that removes all catches tied to callsite guard chain and relinks
*/
protected MethodHandle getPruneCatches() {
return PRUNE_CATCHES;
}
/** /**
* Creates a method that rebuilds our call chain, pruning it of any invalidated switchpoints, and then invokes that * Creates a method that rebuilds our call chain, pruning it of any invalidated switchpoints, and then invokes that
* chain. * chain.

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2015, 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
@ -52,18 +52,18 @@ import jdk.nashorn.internal.runtime.arrays.ArrayLikeIterator;
import jdk.nashorn.internal.scripts.JO; import jdk.nashorn.internal.scripts.JO;
/** /**
* This class is the implementation of the Nashorn-specific global object named {@code JSAdapter}. It can be * This class is the implementation of the Nashorn-specific global object named {@code JSAdapter}. It can be thought of
* thought of as the {@link java.lang.reflect.Proxy} equivalent for JavaScript. NativeJSAdapter calls specially named * as the {@link java.lang.reflect.Proxy} equivalent for JavaScript. A {@code NativeJSAdapter} calls specially named
* JavaScript methods on an adaptee object when property access/update/call/new/delete is attempted on it. Example: * JavaScript methods on an adaptee object when property access/update/call/new/delete is attempted on it. Example:
*<pre> *<pre>
* var y = { * var y = {
* __get__ : function (name) { ... } * __get__ : function (name) { ... }
* __has__ : function (name) { ... } * __has__ : function (name) { ... }
* __put__ : function (name, value) {...} * __put__ : function (name, value) {...}
* __call__ : function (name, arg1, arg2) {...} * __call__ : function (name, arg1, arg2) {...}
* __new__ : function (arg1, arg2) {...} * __new__ : function (arg1, arg2) {...}
* __delete__ : function (name) { ... } * __delete__ : function (name) { ... }
* __getIds__ : function () { ... } * __getKeys__ : function () { ... }
* }; * };
* *
* var x = new JSAdapter(y); * var x = new JSAdapter(y);
@ -74,17 +74,21 @@ import jdk.nashorn.internal.scripts.JO;
* i in x; // calls y.__has__ * i in x; // calls y.__has__
* x.p = 10; // calls y.__put__ * x.p = 10; // calls y.__put__
* delete x.p; // calls y.__delete__ * delete x.p; // calls y.__delete__
* for (i in x) { print(i); } // calls y.__getIds__ * for (i in x) { print(i); } // calls y.__getKeys__
* </pre> * </pre>
* <p> * <p>
* JavaScript caller of adapter object is isolated from the fact that the property access/mutation/deletion are really * The {@code __getKeys__} and {@code __getIds__} properties are mapped to the same operation. Concrete
* calls to JavaScript methods on adaptee. * {@code JSAdapter} implementations are expected to use only one of these. As {@code __getIds__} exists for
* compatibility reasons only, use of {@code __getKeys__} is recommended.
* </p> * </p>
* <p> * <p>
* JSAdapter constructor can optionally receive an "overrides" object. Properties of overrides object is copied to * The JavaScript caller of an adapter object is oblivious of the property access/mutation/deletion's being adapted.
* JSAdapter instance. When user accessed property is one of these, then adaptee's methods like {@code __get__}, * </p>
* {@code __put__} etc. are not called for those. This can be used to make certain "preferred" properties that can be * <p>
* accessed in the usual/faster way avoiding proxy mechanism. Example: * The {@code JSAdapter} constructor can optionally receive an "overrides" object. The properties of overrides object
* are copied to the {@code JSAdapter} instance. In case user-accessed properties are among these, the adaptee's methods
* like {@code __get__}, {@code __put__} etc. are not called for them. This can be used to make certain "preferred"
* properties that can be accessed in the usual/faster way avoiding the proxy mechanism. Example:
* </p> * </p>
* <pre> * <pre>
* var x = new JSAdapter({ foo: 444, bar: 6546 }) { * var x = new JSAdapter({ foo: 444, bar: 6546 }) {
@ -95,13 +99,13 @@ import jdk.nashorn.internal.scripts.JO;
* x.bar = 'hello'; // "bar" directly set without __put__ call * x.bar = 'hello'; // "bar" directly set without __put__ call
* x.prop // calls __get__("prop") as 'prop' is not overridden * x.prop // calls __get__("prop") as 'prop' is not overridden
* </pre> * </pre>
* It is possible to pass a specific prototype for JSAdapter instance by passing three arguments to JSAdapter * It is possible to pass a specific prototype for the {@code JSAdapter} instance by passing three arguments to the
* constructor. So exact signature of JSAdapter constructor is as follows: * {@code JSAdapter} constructor. The exact signature of the {@code JSAdapter} constructor is as follows:
* <pre> * <pre>
* JSAdapter([proto], [overrides], adaptee); * JSAdapter([proto], [overrides], adaptee);
* </pre> * </pre>
* Both proto and overrides are optional - but adaptee is not. When proto is not passed {@code JSAdapter.prototype} is * Both the {@code proto} and {@code overrides} arguments are optional - but {@code adaptee} is not. When {@code proto}
* used. * is not passed, {@code JSAdapter.prototype} is used.
*/ */
@ScriptClass("JSAdapter") @ScriptClass("JSAdapter")
public final class NativeJSAdapter extends ScriptObject { public final class NativeJSAdapter extends ScriptObject {
@ -113,7 +117,7 @@ public final class NativeJSAdapter extends ScriptObject {
public static final String __call__ = "__call__"; public static final String __call__ = "__call__";
/** object new operation */ /** object new operation */
public static final String __new__ = "__new__"; public static final String __new__ = "__new__";
/** object getIds operation */ /** object getIds operation (provided for compatibility reasons; use of getKeys is preferred) */
public static final String __getIds__ = "__getIds__"; public static final String __getIds__ = "__getIds__";
/** object getKeys operation */ /** object getKeys operation */
public static final String __getKeys__ = "__getKeys__"; public static final String __getKeys__ = "__getKeys__";
@ -142,7 +146,7 @@ public final class NativeJSAdapter extends ScriptObject {
private final ScriptObject adaptee; private final ScriptObject adaptee;
private final boolean overrides; private final boolean overrides;
private static final MethodHandle IS_JSADAPTOR = findOwnMH("isJSAdaptor", boolean.class, Object.class, Object.class, MethodHandle.class, Object.class, ScriptFunction.class); private static final MethodHandle IS_JSADAPTER = findOwnMH("isJSAdapter", boolean.class, Object.class, Object.class, MethodHandle.class, Object.class, ScriptFunction.class);
// initialized by nasgen // initialized by nasgen
private static PropertyMap $nasgenmap$; private static PropertyMap $nasgenmap$;
@ -626,7 +630,7 @@ public final class NativeJSAdapter extends ScriptObject {
// to name. Probably not a big deal, but if we can ever make it leaner, it'd be nice. // to name. Probably not a big deal, but if we can ever make it leaner, it'd be nice.
return new GuardedInvocation(MH.dropArguments(MH.constant(Object.class, return new GuardedInvocation(MH.dropArguments(MH.constant(Object.class,
func.createBound(this, new Object[] { name })), 0, Object.class), func.createBound(this, new Object[] { name })), 0, Object.class),
testJSAdaptor(adaptee, null, null, null), testJSAdapter(adaptee, null, null, null),
adaptee.getProtoSwitchPoints(__call__, find.getOwner()), null); adaptee.getProtoSwitchPoints(__call__, find.getOwner()), null);
} }
} }
@ -697,7 +701,7 @@ public final class NativeJSAdapter extends ScriptObject {
if (methodHandle != null) { if (methodHandle != null) {
return new GuardedInvocation( return new GuardedInvocation(
methodHandle, methodHandle,
testJSAdaptor(adaptee, findData.getGetter(Object.class, INVALID_PROGRAM_POINT, null), findData.getOwner(), func), testJSAdapter(adaptee, findData.getGetter(Object.class, INVALID_PROGRAM_POINT, null), findData.getOwner(), func),
adaptee.getProtoSwitchPoints(hook, findData.getOwner()), null); adaptee.getProtoSwitchPoints(hook, findData.getOwner()), null);
} }
} }
@ -710,16 +714,16 @@ public final class NativeJSAdapter extends ScriptObject {
final MethodHandle methodHandle = hook.equals(__put__) ? final MethodHandle methodHandle = hook.equals(__put__) ?
MH.asType(Lookup.EMPTY_SETTER, type) : MH.asType(Lookup.EMPTY_SETTER, type) :
Lookup.emptyGetter(type.returnType()); Lookup.emptyGetter(type.returnType());
return new GuardedInvocation(methodHandle, testJSAdaptor(adaptee, null, null, null), adaptee.getProtoSwitchPoints(hook, null), null); return new GuardedInvocation(methodHandle, testJSAdapter(adaptee, null, null, null), adaptee.getProtoSwitchPoints(hook, null), null);
} }
} }
private static MethodHandle testJSAdaptor(final Object adaptee, final MethodHandle getter, final Object where, final ScriptFunction func) { private static MethodHandle testJSAdapter(final Object adaptee, final MethodHandle getter, final Object where, final ScriptFunction func) {
return MH.insertArguments(IS_JSADAPTOR, 1, adaptee, getter, where, func); return MH.insertArguments(IS_JSADAPTER, 1, adaptee, getter, where, func);
} }
@SuppressWarnings("unused") @SuppressWarnings("unused")
private static boolean isJSAdaptor(final Object self, final Object adaptee, final MethodHandle getter, final Object where, final ScriptFunction func) { private static boolean isJSAdapter(final Object self, final Object adaptee, final MethodHandle getter, final Object where, final ScriptFunction func) {
final boolean res = self instanceof NativeJSAdapter && ((NativeJSAdapter)self).getAdaptee() == adaptee; final boolean res = self instanceof NativeJSAdapter && ((NativeJSAdapter)self).getAdaptee() == adaptee;
if (res && getter != null) { if (res && getter != null) {
try { try {

@ -64,9 +64,6 @@ public class LinkerCallSite extends ChainedCallSite {
private static final String PROFILEFILE = Options.getStringProperty("nashorn.profilefile", "NashornProfile.txt"); private static final String PROFILEFILE = Options.getStringProperty("nashorn.profilefile", "NashornProfile.txt");
private static final MethodHandle INCREASE_MISS_COUNTER = MH.findStatic(MethodHandles.lookup(), LinkerCallSite.class, "increaseMissCount", MH.type(Object.class, String.class, Object.class)); private static final MethodHandle INCREASE_MISS_COUNTER = MH.findStatic(MethodHandles.lookup(), LinkerCallSite.class, "increaseMissCount", MH.type(Object.class, String.class, Object.class));
private static final MethodHandle ON_CATCH_INVALIDATION = MH.findStatic(MethodHandles.lookup(), LinkerCallSite.class, "onCatchInvalidation", MH.type(ChainedCallSite.class, LinkerCallSite.class));
private int catchInvalidations;
LinkerCallSite(final NashornCallSiteDescriptor descriptor) { LinkerCallSite(final NashornCallSiteDescriptor descriptor) {
super(descriptor); super(descriptor);
@ -75,34 +72,6 @@ public class LinkerCallSite extends ChainedCallSite {
} }
} }
@Override
protected MethodHandle getPruneCatches() {
return MH.filterArguments(super.getPruneCatches(), 0, ON_CATCH_INVALIDATION);
}
/**
* Action to perform when a catch guard around a callsite triggers. Increases
* catch invalidation counter
* @param callSite callsite
* @return the callsite, so this can be used as argument filter
*/
@SuppressWarnings("unused")
private static ChainedCallSite onCatchInvalidation(final LinkerCallSite callSite) {
++callSite.catchInvalidations;
return callSite;
}
/**
* Get the number of catch invalidations that have happened at this call site so far
* @param callSiteToken call site token, unique to the callsite.
* @return number of catch invalidations, i.e. thrown exceptions caught by the linker
*/
public static int getCatchInvalidationCount(final Object callSiteToken) {
if (callSiteToken instanceof LinkerCallSite) {
return ((LinkerCallSite)callSiteToken).catchInvalidations;
}
return 0;
}
/** /**
* Construct a new linker call site. * Construct a new linker call site.
* @param name Name of method. * @param name Name of method.

@ -0,0 +1,41 @@
/*
* Copyright (c) 2015, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* Verify that JSAdapter __getIds__ works as expected.
*
* @test
* @run
*/
var obj = new JSAdapter() {
__getIds__: function() {
print("__getIds__ called");
return [ "foo", "bar" ];
}
};
// calls __getIds__
for (i in obj) {
print(i);
}

@ -0,0 +1,3 @@
__getIds__ called
foo
bar

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2010, 2015, 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
@ -45,8 +45,8 @@ var obj = new JSAdapter() {
print("new with " + arg1 + ", " + arg2); print("new with " + arg1 + ", " + arg2);
}, },
__getIds__: function() { __getKeys__: function() {
print("__getIds__ called"); print("__getKeys__ called");
return [ "foo", "bar" ]; return [ "foo", "bar" ];
}, },
@ -78,22 +78,28 @@ obj.func("hello", "world");
// calls __new__ // calls __new__
new obj("hey!", "it works!"); new obj("hey!", "it works!");
// calls __getKeys__
for (i in obj) { for (i in obj) {
print(i); print(i);
} }
// calls __getValues__
for each (i in obj) { for each (i in obj) {
print(i); print(i);
} }
// calls __has__
var x = "foo" in obj; var x = "foo" in obj;
print(x); print(x);
// calls __has__
var y = "js" in obj; var y = "js" in obj;
print(y); print(y);
// calls __delete__
print(delete obj.prop); print(delete obj.prop);
// call __get__ and __set__
print(obj["js"]); print(obj["js"]);
obj["js"] = "javascript"; obj["js"] = "javascript";
print(obj["javascript"]); print(obj["javascript"]);

@ -3,7 +3,7 @@ foo
setter called for 'foo' with 33 setter called for 'foo' with 33
method 'func' called with hello, world method 'func' called with hello, world
new with hey!, it works! new with hey!, it works!
__getIds__ called __getKeys__ called
foo foo
bar bar
__getValues__ called __getValues__ called