OpenJDK / jdk / jdk10
changeset 42395:c80058e8983e
Merge
author | duke |
---|---|
date | Wed, 05 Jul 2017 22:32:06 +0200 |
parents | 285ea8081752 9107477607ea |
children | 925e4d87ebac |
files | hotspot/test/runtime/modules/JVMCanReadModule.java hotspot/test/runtime/modules/JVMIsExportedToModule.java hotspot/test/serviceability/jdwp/JdwpCanReadCmd.java hotspot/test/serviceability/jdwp/JdwpCanReadReply.java jdk/src/java.base/share/classes/java/lang/module/Dependence.java jdk/src/java.base/share/classes/javax/crypto/JceSecurity.java jdk/src/java.base/share/classes/sun/util/locale/provider/ResourceBundleProviderSupport.java jdk/test/java/awt/Focus/DisposedWindow/DisposeDialogNotActivateOwnerTest/DisposeDialogNotActivateOwnerTest.html jdk/test/java/lang/Class/getResource/src/m3/module-info.java jdk/test/java/lang/Class/getResource/src/m3/p3/Main.java jdk/test/java/lang/ClassLoader/getResource/modules/src/m3/module-info.java jdk/test/java/lang/ClassLoader/getResource/modules/src/m3/p3/Main.java jdk/test/java/lang/reflect/Module/access/src/target/p/Exported.java jdk/test/java/lang/reflect/Module/access/src/target/p/Helper.java jdk/test/java/lang/reflect/Module/access/src/target/q/Internal.java jdk/test/java/net/Authenticator/B4933582.sh jdk/test/java/rmi/activation/rmidViaInheritedChannel/RmidViaInheritedChannel.java jdk/test/java/util/ServiceLoader/Basic.java jdk/test/java/util/ServiceLoader/FooProvider1.java jdk/test/java/util/ServiceLoader/FooProvider2.java jdk/test/java/util/ServiceLoader/FooProvider3.java jdk/test/java/util/ServiceLoader/FooService.java jdk/test/java/util/ServiceLoader/Load.java jdk/test/java/util/ServiceLoader/basic.sh jdk/test/java/util/ServiceLoader/modules/MiscTests.java jdk/test/java/util/ServiceLoader/modules/ServicesTest.java jdk/test/java/util/ServiceLoader/modules/src/bananascript/module-info.java jdk/test/java/util/ServiceLoader/modules/src/bananascript/org/banana/BananaScript.java jdk/test/java/util/ServiceLoader/modules/src/bananascript/org/banana/BananaScriptEngineFactory.java jdk/test/java/util/ServiceLoader/modules/src/test/module-info.java jdk/test/java/util/ServiceLoader/modules/src/test/test/Main.java jdk/test/java/util/Spliterator/SpliteratorLateBindingFailFastTest.java make/CreateHgtipFiles.gmk nashorn/test/script/currently-failing/JDK-8130127.js nashorn/test/script/currently-failing/JDK-8130127.js.EXPECTED |
diffstat | 893 files changed, 29600 insertions(+), 11203 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgignore Fri Dec 02 10:52:51 2016 -0800 +++ b/.hgignore Wed Jul 05 22:32:06 2017 +0200 @@ -3,8 +3,7 @@ ^.idea/ nbproject/private/ ^webrev -^.hgtip -^.bridge2 +^.src-rev$ ^.jib/ .DS_Store .metadata/
--- a/.hgtags-top-repo Fri Dec 02 10:52:51 2016 -0800 +++ b/.hgtags-top-repo Wed Jul 05 22:32:06 2017 +0200 @@ -389,3 +389,4 @@ 8d337fd6333e28c48aa87880144b840aad82baaf jdk-9+144 ff98aa9ec9fae991e426ce5926fc9036d25f5562 jdk-9+145 a22e2671d88f6b22a4aa82e3966986542ed2a381 jdk-9+146 +5f6920274c48eb00d31afee6c034826a754c13d9 jdk-9+147
--- a/common/autoconf/boot-jdk.m4 Fri Dec 02 10:52:51 2016 -0800 +++ b/common/autoconf/boot-jdk.m4 Wed Jul 05 22:32:06 2017 +0200 @@ -98,7 +98,7 @@ fi ]) -# Test: Is bootjdk explicitely set by command line arguments? +# Test: Is bootjdk explicitly set by command line arguments? AC_DEFUN([BOOTJDK_CHECK_ARGUMENTS], [ if test "x$with_boot_jdk" != x; then @@ -238,7 +238,7 @@ $1=$BOOT_JDK/bin/$2 if test ! -x [$]$1; then AC_MSG_RESULT(not found) - AC_MSG_NOTICE([Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk]) + AC_MSG_NOTICE([Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk]) AC_MSG_ERROR([Could not find $2 in the Boot JDK]) fi AC_MSG_RESULT(ok) @@ -262,7 +262,7 @@ # we detected something (if so, the path to the jdk is in BOOT_JDK). But we # must check if this is indeed valid; otherwise we'll continue looking. - # Test: Is bootjdk explicitely set by command line arguments? + # Test: Is bootjdk explicitly set by command line arguments? BOOTJDK_DO_CHECK([BOOTJDK_CHECK_ARGUMENTS]) if test "x$with_boot_jdk" != x && test "x$BOOT_JDK_FOUND" = xno; then # Having specified an argument which is incorrect will produce an instant failure; @@ -286,7 +286,7 @@ if test "x$BOOT_JDK_FOUND" = xno; then HELP_MSG_MISSING_DEPENDENCY([openjdk]) AC_MSG_NOTICE([Could not find a valid Boot JDK. $HELP_MSG]) - AC_MSG_NOTICE([This might be fixed by explicitely setting --with-boot-jdk]) + AC_MSG_NOTICE([This might be fixed by explicitly setting --with-boot-jdk]) AC_MSG_ERROR([Cannot continue]) fi
--- a/common/autoconf/build-performance.m4 Fri Dec 02 10:52:51 2016 -0800 +++ b/common/autoconf/build-performance.m4 Wed Jul 05 22:32:06 2017 +0200 @@ -217,6 +217,13 @@ AC_DEFUN([BPERF_SETUP_CCACHE_USAGE], [ if test "x$CCACHE" != x; then + if test "x$OPENJDK_BUILD_OS" = "xmacosx"; then + HAS_BAD_CCACHE=[`$ECHO $CCACHE_VERSION | \ + $GREP -e '^1\.' -e '^2\.' -e '^3\.0\.' -e '^3\.1\.'`] + if test "x$HAS_BAD_CCACHE" != "x"; then + AC_MSG_ERROR([On macosx, ccache 3.2 or later is required, found $CCACHE_VERSION]) + fi + fi if test "x$USE_PRECOMPILED_HEADER" = "x1"; then HAS_BAD_CCACHE=[`$ECHO $CCACHE_VERSION | \ $GREP -e '^1.*' -e '^2.*' -e '^3\.0.*' -e '^3\.1\.[0123]$'`]
--- a/common/autoconf/buildjdk-spec.gmk.in Fri Dec 02 10:52:51 2016 -0800 +++ b/common/autoconf/buildjdk-spec.gmk.in Wed Jul 05 22:32:06 2017 +0200 @@ -86,73 +86,13 @@ # Save speed and disk space by not enabling debug symbols for the buildjdk ENABLE_DEBUG_SYMBOLS := false -#################################################### -# -# Legacy Hotspot support +# Control wether Hotspot builds gtest tests +BUILD_GTEST := false -# Legacy setting: OPT or DBG -VARIANT := OPT -# Legacy setting: true or false -FASTDEBUG := false -# Legacy setting: debugging the class files? -DEBUG_CLASSFILES := false +JVM_VARIANTS := server # Some users still set EXTRA_*FLAGS on the make command line. Must # make sure to override that when building buildjdk. override EXTRA_CFLAGS := override EXTRA_CXXFLAGS := override EXTRA_LDFLAGS := - -# The HOSTCC/HOSTCXX is Hotspot terminology for the BUILD_CC/BUILD_CXX, i.e. the -# compiler that produces code that can be run on the build platform. -HOSTCC := $(BUILD_CC) -HOSTCXX := $(BUILD_CXX) - -# Old name for OPENJDK_TARGET_OS (aix,bsd,hpux,linux,macosx,solaris,windows etc) -PLATFORM := $(OPENJDK_BUILD_OS) -# 32 or 64 bit -ARCH_DATA_MODEL := $(OPENJDK_BUILD_CPU_BITS) - -ALT_BOOTDIR := $(BOOT_JDK) -# Yet another name for arch used for an extra subdir below the jvm lib. -# Uses i386 and amd64, instead of x86 and x86_64. -LIBARCH := @OPENJDK_BUILD_CPU_LEGACY_LIB@ -# Set the cpu architecture. Some users still set ARCH on the make command line. Must -# make sure to override that when building buildjdk. -override ARCH := $(OPENJDK_BUILD_CPU_ARCH) -# Legacy setting for building for a 64 bit machine. -# If yes then this expands to _LP64 := 1 -ifeq ($(OPENJDK_BUILD_CPU_BITS), 64) - _LP64 := 1 -endif - -ALT_OUTPUTDIR := $(HOTSPOT_OUTPUTDIR) -ALT_EXPORT_PATH := $(HOTSPOT_DIST) - -JVM_INTERPRETER := @JVM_INTERPRETER@ -ifeq ($(JVM_INTERPRETER), cpp) - CC_INTERP=true -endif - -HOTSPOT_MAKE_ARGS := product docs export_product - -# Control wether Hotspot builds gtest tests -BUILD_GTEST := false - -USE_PRECOMPILED_HEADER := @USE_PRECOMPILED_HEADER@ - -# Hotspot expects the variable FULL_DEBUG_SYMBOLS=1/0 to control debug symbols -# creation. -FULL_DEBUG_SYMBOLS := 0 -ZIP_DEBUGINFO_FILES := 0 -# Disable stripping -STRIP_POLICY := none - -JVM_VARIANTS := server -JVM_VARIANT_SERVER := true -JVM_VARIANT_CLIENT := false -JVM_VARIANT_MINIMAL1 := false -JVM_VARIANT_KERNEL := false -JVM_VARIANT_ZERO := false -JVM_VARIANT_ZEROSHARK := false -JVM_VARIANT_CORE := false
--- a/common/autoconf/configure.ac Fri Dec 02 10:52:51 2016 -0800 +++ b/common/autoconf/configure.ac Wed Jul 05 22:32:06 2017 +0200 @@ -182,7 +182,6 @@ # Finally do some processing after the detection phase TOOLCHAIN_SETUP_BUILD_COMPILERS -TOOLCHAIN_SETUP_LEGACY TOOLCHAIN_MISC_CHECKS # Setup the JTReg Regression Test Harness.
--- a/common/autoconf/flags.m4 Fri Dec 02 10:52:51 2016 -0800 +++ b/common/autoconf/flags.m4 Wed Jul 05 22:32:06 2017 +0200 @@ -1378,7 +1378,7 @@ AC_MSG_CHECKING([if native warnings are errors]) if test "x$enable_warnings_as_errors" = "xyes"; then - AC_MSG_RESULT([yes (explicitely set)]) + AC_MSG_RESULT([yes (explicitly set)]) WARNINGS_AS_ERRORS=true elif test "x$enable_warnings_as_errors" = "xno"; then AC_MSG_RESULT([no])
--- a/common/autoconf/generated-configure.sh Fri Dec 02 10:52:51 2016 -0800 +++ b/common/autoconf/generated-configure.sh Wed Jul 05 22:32:06 2017 +0200 @@ -700,8 +700,6 @@ JVM_FEATURES_server INCLUDE_DTRACE GCOV_ENABLED -STRIP_POLICY -DEBUG_BINARIES ZIP_EXTERNAL_DEBUG_SYMBOLS COPY_DEBUG_SYMBOLS COMPILE_WITH_DEBUG_SYMBOLS @@ -791,11 +789,6 @@ HOTSPOT_TOOLCHAIN_TYPE USING_BROKEN_SUSE_LD PACKAGE_PATH -USE_CLANG -HOTSPOT_LD -HOTSPOT_CXX -HOTSPOT_RC -HOTSPOT_MT BUILD_AS BUILD_LDCXX BUILD_LD @@ -1974,8 +1967,8 @@ --enable-debug set the debug level to fastdebug (shorthand for --with-debug-level=fastdebug) [disabled] --enable-headless-only only build headless (no GUI) support [disabled] - --enable-unlimited-crypto - Enable unlimited crypto policy [disabled] + --disable-unlimited-crypto + Disable unlimited crypto policy [enabled] --disable-keep-packaged-modules Do not keep packaged modules in jdk image [enable] --enable-static-build enable static library build [disabled] @@ -3851,7 +3844,7 @@ # $1 A command line (typically autoconf macro) to execute -# Test: Is bootjdk explicitely set by command line arguments? +# Test: Is bootjdk explicitly set by command line arguments? # Test: Is $JAVA_HOME set? @@ -4911,7 +4904,7 @@ # Minimum supported versions, empty means unspecified TOOLCHAIN_MINIMUM_VERSION_clang="3.2" TOOLCHAIN_MINIMUM_VERSION_gcc="4.3" -TOOLCHAIN_MINIMUM_VERSION_microsoft="" +TOOLCHAIN_MINIMUM_VERSION_microsoft="16.00.30319.01" # VS2010 TOOLCHAIN_MINIMUM_VERSION_solstudio="5.13" TOOLCHAIN_MINIMUM_VERSION_xlc="" @@ -4982,10 +4975,6 @@ # for this, we can only do this after these have been setup. -# Setup legacy variables that are still needed as alternative ways to refer to -# parts of the toolchain. - - # Do some additional checks on the detected tools. @@ -5093,7 +5082,7 @@ #CUSTOM_AUTOCONF_INCLUDE # Do not change or remove the following line, it is needed for consistency checks: -DATE_WHEN_GENERATED=1479997904 +DATE_WHEN_GENERATED=1480714260 ############################################################################### # @@ -15523,7 +15512,7 @@ ;; esac - # ..and setup our own variables. (Do this explicitely to facilitate searching) + # ..and setup our own variables. (Do this explicitly to facilitate searching) OPENJDK_BUILD_OS="$VAR_OS" if test "x$VAR_OS_TYPE" != x; then OPENJDK_BUILD_OS_TYPE="$VAR_OS_TYPE" @@ -15662,7 +15651,7 @@ ;; esac - # ... and setup our own variables. (Do this explicitely to facilitate searching) + # ... and setup our own variables. (Do this explicitly to facilitate searching) OPENJDK_TARGET_OS="$VAR_OS" if test "x$VAR_OS_TYPE" != x; then OPENJDK_TARGET_OS_TYPE="$VAR_OS_TYPE" @@ -24240,7 +24229,7 @@ if test "${enable_unlimited_crypto+set}" = set; then : enableval=$enable_unlimited_crypto; else - enable_unlimited_crypto=no + enable_unlimited_crypto=yes fi if test "x$enable_unlimited_crypto" = "xyes"; then @@ -24400,7 +24389,7 @@ as_fn_error $? "Version string contains + but both 'BUILD' and 'OPT' are missing" "$LINENO" 5 fi # Stop the version part process from setting default values. - # We still allow them to explicitely override though. + # We still allow them to explicitly override though. NO_DEFAULT_VERSION_PARTS=true else as_fn_error $? "--with-version-string fails to parse as a valid version string: $with_version_string" "$LINENO" 5 @@ -24769,7 +24758,7 @@ # we detected something (if so, the path to the jdk is in BOOT_JDK). But we # must check if this is indeed valid; otherwise we'll continue looking. - # Test: Is bootjdk explicitely set by command line arguments? + # Test: Is bootjdk explicitly set by command line arguments? if test "x$BOOT_JDK_FOUND" = xno; then # Now execute the test @@ -29887,8 +29876,8 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find a valid Boot JDK. $HELP_MSG" >&5 $as_echo "$as_me: Could not find a valid Boot JDK. $HELP_MSG" >&6;} - { $as_echo "$as_me:${as_lineno-$LINENO}: This might be fixed by explicitely setting --with-boot-jdk" >&5 -$as_echo "$as_me: This might be fixed by explicitely setting --with-boot-jdk" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be fixed by explicitly setting --with-boot-jdk" >&5 +$as_echo "$as_me: This might be fixed by explicitly setting --with-boot-jdk" >&6;} as_fn_error $? "Cannot continue" "$LINENO" 5 fi @@ -29910,8 +29899,8 @@ if test ! -x $JAVA; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 -$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&5 +$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&6;} as_fn_error $? "Could not find java in the Boot JDK" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 @@ -29938,8 +29927,8 @@ if test ! -x $JAVA; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 -$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&5 +$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&6;} as_fn_error $? "Could not find java in the Boot JDK" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 @@ -30048,8 +30037,8 @@ if test ! -x $JAVAC; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 -$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&5 +$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&6;} as_fn_error $? "Could not find javac in the Boot JDK" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 @@ -30076,8 +30065,8 @@ if test ! -x $JAVAC; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 -$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&5 +$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&6;} as_fn_error $? "Could not find javac in the Boot JDK" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 @@ -30186,8 +30175,8 @@ if test ! -x $JAVAH; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 -$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&5 +$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&6;} as_fn_error $? "Could not find javah in the Boot JDK" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 @@ -30214,8 +30203,8 @@ if test ! -x $JAVAH; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 -$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&5 +$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&6;} as_fn_error $? "Could not find javah in the Boot JDK" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 @@ -30324,8 +30313,8 @@ if test ! -x $JAR; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 -$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&5 +$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&6;} as_fn_error $? "Could not find jar in the Boot JDK" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 @@ -30352,8 +30341,8 @@ if test ! -x $JAR; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 -$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&5 +$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&6;} as_fn_error $? "Could not find jar in the Boot JDK" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 @@ -30462,8 +30451,8 @@ if test ! -x $JARSIGNER; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 -$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&5 +$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&6;} as_fn_error $? "Could not find jarsigner in the Boot JDK" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 @@ -30490,8 +30479,8 @@ if test ! -x $JARSIGNER; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&5 -$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitely setting --with-boot-jdk" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&5 +$as_echo "$as_me: Your Boot JDK seems broken. This might be fixed by explicitly setting --with-boot-jdk" >&6;} as_fn_error $? "Could not find jarsigner in the Boot JDK" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 @@ -31198,6 +31187,12 @@ if test -d "$IMPORT_MODULES_TOPDIR/modules_src"; then IMPORT_MODULES_SRC="$IMPORT_MODULES_TOPDIR/modules_src" fi + # Workaround for using different imported module-info.java in Jake due to a + # change in format. Remove once new format is standard in JDK 9 and javafx + # delivers just that. + if test -d "$IMPORT_MODULES_TOPDIR/modules_src_jake"; then + IMPORT_MODULES_SRC="$IMPORT_MODULES_TOPDIR/modules_src_jake $IMPORT_MODULES_SRC" + fi if test -d "$IMPORT_MODULES_TOPDIR/make"; then IMPORT_MODULES_MAKE="$IMPORT_MODULES_TOPDIR/make" fi @@ -33578,9 +33573,11 @@ if test "x$TOOLCHAIN_TYPE" = xsolstudio; then # cc -V output typically looks like # cc: Sun C 5.12 Linux_i386 2011/11/16 + # or + # cc: Studio 12.5 Sun C 5.14 SunOS_sparc 2016/05/31 COMPILER_VERSION_OUTPUT=`$COMPILER -V 2>&1` # Check that this is likely to be the Solaris Studio cc. - $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null + $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "^.* Sun $COMPILER_NAME" > /dev/null if test $? -ne 0; then ALT_VERSION_OUTPUT=`$COMPILER --version 2>&1` { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&5 @@ -34875,9 +34872,11 @@ if test "x$TOOLCHAIN_TYPE" = xsolstudio; then # cc -V output typically looks like # cc: Sun C 5.12 Linux_i386 2011/11/16 + # or + # cc: Studio 12.5 Sun C 5.14 SunOS_sparc 2016/05/31 COMPILER_VERSION_OUTPUT=`$COMPILER -V 2>&1` # Check that this is likely to be the Solaris Studio cc. - $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null + $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "^.* Sun $COMPILER_NAME" > /dev/null if test $? -ne 0; then ALT_VERSION_OUTPUT=`$COMPILER --version 2>&1` { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&5 @@ -35261,9 +35260,9 @@ fi # We only check CC_VERSION_NUMBER since we assume CXX_VERSION_NUMBER is equal. - if [[ "[$]CC_VERSION_NUMBER" =~ (.*\.){3} ]] ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C compiler version number has more than three parts (X.Y.Z): $CC_VERSION_NUMBER. Comparisons might be wrong." >&5 -$as_echo "$as_me: WARNING: C compiler version number has more than three parts (X.Y.Z): $CC_VERSION_NUMBER. Comparisons might be wrong." >&2;} + if [[ "[$]CC_VERSION_NUMBER" =~ (.*\.){4} ]] ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C compiler version number has more than four parts (W.X.Y.Z): $CC_VERSION_NUMBER. Comparisons might be wrong." >&5 +$as_echo "$as_me: WARNING: C compiler version number has more than four parts (W.X.Y.Z): $CC_VERSION_NUMBER. Comparisons might be wrong." >&2;} fi if [[ "[$]CC_VERSION_NUMBER" =~ [0-9]{6} ]] ; then @@ -35271,7 +35270,7 @@ $as_echo "$as_me: WARNING: C compiler version number has a part larger than 99999: $CC_VERSION_NUMBER. Comparisons might be wrong." >&2;} fi - COMPARABLE_ACTUAL_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", $1, $2, $3) }' <<< "$CC_VERSION_NUMBER"` + COMPARABLE_ACTUAL_VERSION=`$AWK -F. '{ printf("%05d%05d%05d%05d\n", $1, $2, $3, $4) }' <<< "$CC_VERSION_NUMBER"` if test "x$TOOLCHAIN_MINIMUM_VERSION" != x; then @@ -35329,8 +35328,8 @@ # Need to assign to a variable since m4 is blocked from modifying parts in []. REFERENCE_VERSION=$TOOLCHAIN_MINIMUM_VERSION - if [[ "$REFERENCE_VERSION" =~ (.*\.){3} ]] ; then - as_fn_error $? "Internal error: Cannot compare to $TOOLCHAIN_MINIMUM_VERSION, only three parts (X.Y.Z) is supported" "$LINENO" 5 + if [[ "$REFERENCE_VERSION" =~ (.*\.){4} ]] ; then + as_fn_error $? "Internal error: Cannot compare to $TOOLCHAIN_MINIMUM_VERSION, only four parts (W.X.Y.Z) is supported" "$LINENO" 5 fi if [[ "$REFERENCE_VERSION" =~ [0-9]{6} ]] ; then @@ -35338,7 +35337,7 @@ fi # Version comparison method inspired by http://stackoverflow.com/a/24067243 - COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", $1, $2, $3) }' <<< "$REFERENCE_VERSION"` + COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d%05d\n", $1, $2, $3, $4) }' <<< "$REFERENCE_VERSION"` if test $COMPARABLE_ACTUAL_VERSION -ge $COMPARABLE_REFERENCE_VERSION ; then : @@ -46956,9 +46955,11 @@ if test "x$TOOLCHAIN_TYPE" = xsolstudio; then # cc -V output typically looks like # cc: Sun C 5.12 Linux_i386 2011/11/16 + # or + # cc: Studio 12.5 Sun C 5.14 SunOS_sparc 2016/05/31 COMPILER_VERSION_OUTPUT=`$COMPILER -V 2>&1` # Check that this is likely to be the Solaris Studio cc. - $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null + $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "^.* Sun $COMPILER_NAME" > /dev/null if test $? -ne 0; then ALT_VERSION_OUTPUT=`$COMPILER --version 2>&1` { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&5 @@ -47076,9 +47077,11 @@ if test "x$TOOLCHAIN_TYPE" = xsolstudio; then # cc -V output typically looks like # cc: Sun C 5.12 Linux_i386 2011/11/16 + # or + # cc: Studio 12.5 Sun C 5.14 SunOS_sparc 2016/05/31 COMPILER_VERSION_OUTPUT=`$COMPILER -V 2>&1` # Check that this is likely to be the Solaris Studio cc. - $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null + $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "^.* Sun $COMPILER_NAME" > /dev/null if test $? -ne 0; then ALT_VERSION_OUTPUT=`$COMPILER --version 2>&1` { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler." >&5 @@ -47198,9 +47201,9 @@ fi # We only check CC_VERSION_NUMBER since we assume CXX_VERSION_NUMBER is equal. - if [[ "[$]BUILD_CC_VERSION_NUMBER" =~ (.*\.){3} ]] ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C compiler version number has more than three parts (X.Y.Z): $BUILD_CC_VERSION_NUMBER. Comparisons might be wrong." >&5 -$as_echo "$as_me: WARNING: C compiler version number has more than three parts (X.Y.Z): $BUILD_CC_VERSION_NUMBER. Comparisons might be wrong." >&2;} + if [[ "[$]BUILD_CC_VERSION_NUMBER" =~ (.*\.){4} ]] ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C compiler version number has more than four parts (W.X.Y.Z): $BUILD_CC_VERSION_NUMBER. Comparisons might be wrong." >&5 +$as_echo "$as_me: WARNING: C compiler version number has more than four parts (W.X.Y.Z): $BUILD_CC_VERSION_NUMBER. Comparisons might be wrong." >&2;} fi if [[ "[$]BUILD_CC_VERSION_NUMBER" =~ [0-9]{6} ]] ; then @@ -47208,7 +47211,7 @@ $as_echo "$as_me: WARNING: C compiler version number has a part larger than 99999: $BUILD_CC_VERSION_NUMBER. Comparisons might be wrong." >&2;} fi - OPENJDK_BUILD_COMPARABLE_ACTUAL_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", $1, $2, $3) }' <<< "$BUILD_CC_VERSION_NUMBER"` + OPENJDK_BUILD_COMPARABLE_ACTUAL_VERSION=`$AWK -F. '{ printf("%05d%05d%05d%05d\n", $1, $2, $3, $4) }' <<< "$BUILD_CC_VERSION_NUMBER"` else # If we are not cross compiling, use the normal target compilers for @@ -47234,9 +47237,9 @@ fi # We only check CC_VERSION_NUMBER since we assume CXX_VERSION_NUMBER is equal. - if [[ "[$]CC_VERSION_NUMBER" =~ (.*\.){3} ]] ; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C compiler version number has more than three parts (X.Y.Z): $CC_VERSION_NUMBER. Comparisons might be wrong." >&5 -$as_echo "$as_me: WARNING: C compiler version number has more than three parts (X.Y.Z): $CC_VERSION_NUMBER. Comparisons might be wrong." >&2;} + if [[ "[$]CC_VERSION_NUMBER" =~ (.*\.){4} ]] ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C compiler version number has more than four parts (W.X.Y.Z): $CC_VERSION_NUMBER. Comparisons might be wrong." >&5 +$as_echo "$as_me: WARNING: C compiler version number has more than four parts (W.X.Y.Z): $CC_VERSION_NUMBER. Comparisons might be wrong." >&2;} fi if [[ "[$]CC_VERSION_NUMBER" =~ [0-9]{6} ]] ; then @@ -47244,80 +47247,18 @@ $as_echo "$as_me: WARNING: C compiler version number has a part larger than 99999: $CC_VERSION_NUMBER. Comparisons might be wrong." >&2;} fi - OPENJDK_BUILD_COMPARABLE_ACTUAL_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", $1, $2, $3) }' <<< "$CC_VERSION_NUMBER"` - - fi - - - - - - - - - - - - - if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then - # For hotspot, we need these in Windows mixed path, - # so rewrite them all. Need added .exe suffix. - HOTSPOT_CXX="$CXX.exe" - HOTSPOT_LD="$LD.exe" - HOTSPOT_MT="$MT.exe" - HOTSPOT_RC="$RC.exe" - - unix_path="$HOTSPOT_CXX" - if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - windows_path=`$CYGPATH -m "$unix_path"` - HOTSPOT_CXX="$windows_path" - elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then - windows_path=`cmd //c echo $unix_path` - HOTSPOT_CXX="$windows_path" - fi - - - unix_path="$HOTSPOT_LD" - if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - windows_path=`$CYGPATH -m "$unix_path"` - HOTSPOT_LD="$windows_path" - elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then - windows_path=`cmd //c echo $unix_path` - HOTSPOT_LD="$windows_path" - fi - - - unix_path="$HOTSPOT_MT" - if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - windows_path=`$CYGPATH -m "$unix_path"` - HOTSPOT_MT="$windows_path" - elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then - windows_path=`cmd //c echo $unix_path` - HOTSPOT_MT="$windows_path" - fi - - - unix_path="$HOTSPOT_RC" - if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - windows_path=`$CYGPATH -m "$unix_path"` - HOTSPOT_RC="$windows_path" - elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then - windows_path=`cmd //c echo $unix_path` - HOTSPOT_RC="$windows_path" - fi - - - - else - HOTSPOT_CXX="$CXX" - HOTSPOT_LD="$LD" - fi - - - - if test "x$TOOLCHAIN_TYPE" = xclang; then - USE_CLANG=true - fi + OPENJDK_BUILD_COMPARABLE_ACTUAL_VERSION=`$AWK -F. '{ printf("%05d%05d%05d%05d\n", $1, $2, $3, $4) }' <<< "$CC_VERSION_NUMBER"` + + fi + + + + + + + + + @@ -49914,8 +49855,8 @@ # Need to assign to a variable since m4 is blocked from modifying parts in []. REFERENCE_VERSION=6 - if [[ "$REFERENCE_VERSION" =~ (.*\.){3} ]] ; then - as_fn_error $? "Internal error: Cannot compare to 6, only three parts (X.Y.Z) is supported" "$LINENO" 5 + if [[ "$REFERENCE_VERSION" =~ (.*\.){4} ]] ; then + as_fn_error $? "Internal error: Cannot compare to 6, only four parts (W.X.Y.Z) is supported" "$LINENO" 5 fi if [[ "$REFERENCE_VERSION" =~ [0-9]{6} ]] ; then @@ -49923,7 +49864,7 @@ fi # Version comparison method inspired by http://stackoverflow.com/a/24067243 - COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", $1, $2, $3) }' <<< "$REFERENCE_VERSION"` + COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d%05d\n", $1, $2, $3, $4) }' <<< "$REFERENCE_VERSION"` if test $COMPARABLE_ACTUAL_VERSION -ge $COMPARABLE_REFERENCE_VERSION ; then : @@ -50214,8 +50155,8 @@ # Need to assign to a variable since m4 is blocked from modifying parts in []. REFERENCE_VERSION=4.8 - if [[ "$REFERENCE_VERSION" =~ (.*\.){3} ]] ; then - as_fn_error $? "Internal error: Cannot compare to 4.8, only three parts (X.Y.Z) is supported" "$LINENO" 5 + if [[ "$REFERENCE_VERSION" =~ (.*\.){4} ]] ; then + as_fn_error $? "Internal error: Cannot compare to 4.8, only four parts (W.X.Y.Z) is supported" "$LINENO" 5 fi if [[ "$REFERENCE_VERSION" =~ [0-9]{6} ]] ; then @@ -50223,7 +50164,7 @@ fi # Version comparison method inspired by http://stackoverflow.com/a/24067243 - COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", $1, $2, $3) }' <<< "$REFERENCE_VERSION"` + COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d%05d\n", $1, $2, $3, $4) }' <<< "$REFERENCE_VERSION"` if test $COMPARABLE_ACTUAL_VERSION -ge $COMPARABLE_REFERENCE_VERSION ; then : @@ -50737,8 +50678,8 @@ # Need to assign to a variable since m4 is blocked from modifying parts in []. REFERENCE_VERSION=6 - if [[ "$REFERENCE_VERSION" =~ (.*\.){3} ]] ; then - as_fn_error $? "Internal error: Cannot compare to 6, only three parts (X.Y.Z) is supported" "$LINENO" 5 + if [[ "$REFERENCE_VERSION" =~ (.*\.){4} ]] ; then + as_fn_error $? "Internal error: Cannot compare to 6, only four parts (W.X.Y.Z) is supported" "$LINENO" 5 fi if [[ "$REFERENCE_VERSION" =~ [0-9]{6} ]] ; then @@ -50746,7 +50687,7 @@ fi # Version comparison method inspired by http://stackoverflow.com/a/24067243 - COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", $1, $2, $3) }' <<< "$REFERENCE_VERSION"` + COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d%05d\n", $1, $2, $3, $4) }' <<< "$REFERENCE_VERSION"` if test $OPENJDK_BUILD_COMPARABLE_ACTUAL_VERSION -ge $COMPARABLE_REFERENCE_VERSION ; then : @@ -51037,8 +50978,8 @@ # Need to assign to a variable since m4 is blocked from modifying parts in []. REFERENCE_VERSION=4.8 - if [[ "$REFERENCE_VERSION" =~ (.*\.){3} ]] ; then - as_fn_error $? "Internal error: Cannot compare to 4.8, only three parts (X.Y.Z) is supported" "$LINENO" 5 + if [[ "$REFERENCE_VERSION" =~ (.*\.){4} ]] ; then + as_fn_error $? "Internal error: Cannot compare to 4.8, only four parts (W.X.Y.Z) is supported" "$LINENO" 5 fi if [[ "$REFERENCE_VERSION" =~ [0-9]{6} ]] ; then @@ -51046,7 +50987,7 @@ fi # Version comparison method inspired by http://stackoverflow.com/a/24067243 - COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", $1, $2, $3) }' <<< "$REFERENCE_VERSION"` + COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d%05d\n", $1, $2, $3, $4) }' <<< "$REFERENCE_VERSION"` if test $OPENJDK_BUILD_COMPARABLE_ACTUAL_VERSION -ge $COMPARABLE_REFERENCE_VERSION ; then : @@ -51917,8 +51858,8 @@ { $as_echo "$as_me:${as_lineno-$LINENO}: checking if native warnings are errors" >&5 $as_echo_n "checking if native warnings are errors... " >&6; } if test "x$enable_warnings_as_errors" = "xyes"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (explicitely set)" >&5 -$as_echo "yes (explicitely set)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes (explicitly set)" >&5 +$as_echo "yes (explicitly set)" >&6; } WARNINGS_AS_ERRORS=true elif test "x$enable_warnings_as_errors" = "xno"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 @@ -52583,28 +52524,14 @@ COMPILE_WITH_DEBUG_SYMBOLS=true COPY_DEBUG_SYMBOLS=true ZIP_EXTERNAL_DEBUG_SYMBOLS=true - - # Hotspot legacy support, not relevant with COPY_DEBUG_SYMBOLS=true - DEBUG_BINARIES=false - STRIP_POLICY=min_strip - elif test "x$NATIVE_DEBUG_SYMBOLS" = xnone; then COMPILE_WITH_DEBUG_SYMBOLS=false COPY_DEBUG_SYMBOLS=false ZIP_EXTERNAL_DEBUG_SYMBOLS=false - - DEBUG_BINARIES=false - STRIP_POLICY=no_strip elif test "x$NATIVE_DEBUG_SYMBOLS" = xinternal; then COMPILE_WITH_DEBUG_SYMBOLS=true COPY_DEBUG_SYMBOLS=false ZIP_EXTERNAL_DEBUG_SYMBOLS=false - - # Hotspot legacy support, will turn on -g when COPY_DEBUG_SYMBOLS=false - DEBUG_BINARIES=true - STRIP_POLICY=no_strip - STRIP="" - elif test "x$NATIVE_DEBUG_SYMBOLS" = xexternal; then if test "x$OPENJDK_TARGET_OS" = xsolaris || test "x$OPENJDK_TARGET_OS" = xlinux; then @@ -52618,10 +52545,6 @@ COMPILE_WITH_DEBUG_SYMBOLS=true COPY_DEBUG_SYMBOLS=true ZIP_EXTERNAL_DEBUG_SYMBOLS=false - - # Hotspot legacy support, not relevant with COPY_DEBUG_SYMBOLS=true - DEBUG_BINARIES=false - STRIP_POLICY=min_strip else as_fn_error $? "Allowed native debug symbols are: none, internal, external, zipped" "$LINENO" 5 fi @@ -52670,10 +52593,6 @@ - # Legacy values - - - # Check whether --enable-native-coverage was given. if test "${enable_native_coverage+set}" = set; then : @@ -53195,7 +53114,7 @@ if test "x$with_msvcr_dll" != x; then - # If given explicitely by user, do not probe. If not present, fail directly. + # If given explicitly by user, do not probe. If not present, fail directly. DLL_NAME="$MSVCR_NAME" POSSIBLE_MSVC_DLL="$with_msvcr_dll" @@ -54544,7 +54463,7 @@ if test "x$MSVCP_NAME" != "x"; then if test "x$with_msvcp_dll" != x; then - # If given explicitely by user, do not probe. If not present, fail directly. + # If given explicitly by user, do not probe. If not present, fail directly. DLL_NAME="$MSVCP_NAME" POSSIBLE_MSVC_DLL="$with_msvcp_dll" @@ -55903,7 +55822,7 @@ 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. + # libraries, unless explicitly overridden. if test "x$x_includes" = xNONE; then x_includes="${with_x}/include" fi @@ -65525,6 +65444,13 @@ if test "x$CCACHE" != x; then if test "x$CCACHE" != x; then + if test "x$OPENJDK_BUILD_OS" = "xmacosx"; then + HAS_BAD_CCACHE=`$ECHO $CCACHE_VERSION | \ + $GREP -e '^1\.' -e '^2\.' -e '^3\.0\.' -e '^3\.1\.'` + if test "x$HAS_BAD_CCACHE" != "x"; then + as_fn_error $? "On macosx, ccache 3.2 or later is required, found $CCACHE_VERSION" "$LINENO" 5 + fi + fi if test "x$USE_PRECOMPILED_HEADER" = "x1"; then HAS_BAD_CCACHE=`$ECHO $CCACHE_VERSION | \ $GREP -e '^1.*' -e '^2.*' -e '^3\.0.*' -e '^3\.1\.[0123]$'`
--- a/common/autoconf/jdk-options.m4 Fri Dec 02 10:52:51 2016 -0800 +++ b/common/autoconf/jdk-options.m4 Wed Jul 05 22:32:06 2017 +0200 @@ -163,9 +163,9 @@ AC_SUBST(CACERTS_FILE) # Enable or disable unlimited crypto - AC_ARG_ENABLE(unlimited-crypto, [AS_HELP_STRING([--enable-unlimited-crypto], - [Enable unlimited crypto policy @<:@disabled@:>@])],, - [enable_unlimited_crypto=no]) + AC_ARG_ENABLE(unlimited-crypto, [AS_HELP_STRING([--disable-unlimited-crypto], + [Disable unlimited crypto policy @<:@enabled@:>@])],, + [enable_unlimited_crypto=yes]) if test "x$enable_unlimited_crypto" = "xyes"; then UNLIMITED_CRYPTO=true else @@ -265,28 +265,14 @@ COMPILE_WITH_DEBUG_SYMBOLS=true COPY_DEBUG_SYMBOLS=true ZIP_EXTERNAL_DEBUG_SYMBOLS=true - - # Hotspot legacy support, not relevant with COPY_DEBUG_SYMBOLS=true - DEBUG_BINARIES=false - STRIP_POLICY=min_strip - elif test "x$NATIVE_DEBUG_SYMBOLS" = xnone; then COMPILE_WITH_DEBUG_SYMBOLS=false COPY_DEBUG_SYMBOLS=false ZIP_EXTERNAL_DEBUG_SYMBOLS=false - - DEBUG_BINARIES=false - STRIP_POLICY=no_strip elif test "x$NATIVE_DEBUG_SYMBOLS" = xinternal; then COMPILE_WITH_DEBUG_SYMBOLS=true COPY_DEBUG_SYMBOLS=false ZIP_EXTERNAL_DEBUG_SYMBOLS=false - - # Hotspot legacy support, will turn on -g when COPY_DEBUG_SYMBOLS=false - DEBUG_BINARIES=true - STRIP_POLICY=no_strip - STRIP="" - elif test "x$NATIVE_DEBUG_SYMBOLS" = xexternal; then if test "x$OPENJDK_TARGET_OS" = xsolaris || test "x$OPENJDK_TARGET_OS" = xlinux; then @@ -300,10 +286,6 @@ COMPILE_WITH_DEBUG_SYMBOLS=true COPY_DEBUG_SYMBOLS=true ZIP_EXTERNAL_DEBUG_SYMBOLS=false - - # Hotspot legacy support, not relevant with COPY_DEBUG_SYMBOLS=true - DEBUG_BINARIES=false - STRIP_POLICY=min_strip else AC_MSG_ERROR([Allowed native debug symbols are: none, internal, external, zipped]) fi @@ -321,10 +303,6 @@ AC_SUBST(COMPILE_WITH_DEBUG_SYMBOLS) AC_SUBST(COPY_DEBUG_SYMBOLS) AC_SUBST(ZIP_EXTERNAL_DEBUG_SYMBOLS) - - # Legacy values - AC_SUBST(DEBUG_BINARIES) - AC_SUBST(STRIP_POLICY) ]) ################################################################################
--- a/common/autoconf/jdk-version.m4 Fri Dec 02 10:52:51 2016 -0800 +++ b/common/autoconf/jdk-version.m4 Wed Jul 05 22:32:06 2017 +0200 @@ -110,7 +110,7 @@ AC_MSG_ERROR([Version string contains + but both 'BUILD' and 'OPT' are missing]) fi # Stop the version part process from setting default values. - # We still allow them to explicitely override though. + # We still allow them to explicitly override though. NO_DEFAULT_VERSION_PARTS=true else AC_MSG_ERROR([--with-version-string fails to parse as a valid version string: $with_version_string])
--- a/common/autoconf/lib-x11.m4 Fri Dec 02 10:52:51 2016 -0800 +++ b/common/autoconf/lib-x11.m4 Wed Jul 05 22:32:06 2017 +0200 @@ -42,7 +42,7 @@ 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. + # libraries, unless explicitly overridden. if test "x$x_includes" = xNONE; then x_includes="${with_x}/include" fi
--- a/common/autoconf/platform.m4 Fri Dec 02 10:52:51 2016 -0800 +++ b/common/autoconf/platform.m4 Wed Jul 05 22:32:06 2017 +0200 @@ -162,7 +162,7 @@ # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. PLATFORM_EXTRACT_VARS_FROM_OS($build_os) PLATFORM_EXTRACT_VARS_FROM_CPU($build_cpu) - # ..and setup our own variables. (Do this explicitely to facilitate searching) + # ..and setup our own variables. (Do this explicitly to facilitate searching) OPENJDK_BUILD_OS="$VAR_OS" if test "x$VAR_OS_TYPE" != x; then OPENJDK_BUILD_OS_TYPE="$VAR_OS_TYPE" @@ -192,7 +192,7 @@ # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. PLATFORM_EXTRACT_VARS_FROM_OS($host_os) PLATFORM_EXTRACT_VARS_FROM_CPU($host_cpu) - # ... and setup our own variables. (Do this explicitely to facilitate searching) + # ... and setup our own variables. (Do this explicitly to facilitate searching) OPENJDK_TARGET_OS="$VAR_OS" if test "x$VAR_OS_TYPE" != x; then OPENJDK_TARGET_OS_TYPE="$VAR_OS_TYPE"
--- a/common/autoconf/source-dirs.m4 Fri Dec 02 10:52:51 2016 -0800 +++ b/common/autoconf/source-dirs.m4 Wed Jul 05 22:32:06 2017 +0200 @@ -126,6 +126,12 @@ if test -d "$IMPORT_MODULES_TOPDIR/modules_src"; then IMPORT_MODULES_SRC="$IMPORT_MODULES_TOPDIR/modules_src" fi + # Workaround for using different imported module-info.java in Jake due to a + # change in format. Remove once new format is standard in JDK 9 and javafx + # delivers just that. + if test -d "$IMPORT_MODULES_TOPDIR/modules_src_jake"; then + IMPORT_MODULES_SRC="$IMPORT_MODULES_TOPDIR/modules_src_jake $IMPORT_MODULES_SRC" + fi if test -d "$IMPORT_MODULES_TOPDIR/make"; then IMPORT_MODULES_MAKE="$IMPORT_MODULES_TOPDIR/make" fi
--- a/common/autoconf/toolchain.m4 Fri Dec 02 10:52:51 2016 -0800 +++ b/common/autoconf/toolchain.m4 Wed Jul 05 22:32:06 2017 +0200 @@ -53,7 +53,7 @@ # Minimum supported versions, empty means unspecified TOOLCHAIN_MINIMUM_VERSION_clang="3.2" TOOLCHAIN_MINIMUM_VERSION_gcc="4.3" -TOOLCHAIN_MINIMUM_VERSION_microsoft="" +TOOLCHAIN_MINIMUM_VERSION_microsoft="16.00.30319.01" # VS2010 TOOLCHAIN_MINIMUM_VERSION_solstudio="5.13" TOOLCHAIN_MINIMUM_VERSION_xlc="" @@ -69,15 +69,15 @@ fi # We only check CC_VERSION_NUMBER since we assume CXX_VERSION_NUMBER is equal. - if [ [[ "[$]$1CC_VERSION_NUMBER" =~ (.*\.){3} ]] ]; then - AC_MSG_WARN([C compiler version number has more than three parts (X.Y.Z): [$]$1CC_VERSION_NUMBER. Comparisons might be wrong.]) + if [ [[ "[$]$1CC_VERSION_NUMBER" =~ (.*\.){4} ]] ]; then + AC_MSG_WARN([C compiler version number has more than four parts (W.X.Y.Z): [$]$1CC_VERSION_NUMBER. Comparisons might be wrong.]) fi if [ [[ "[$]$1CC_VERSION_NUMBER" =~ [0-9]{6} ]] ]; then AC_MSG_WARN([C compiler version number has a part larger than 99999: [$]$1CC_VERSION_NUMBER. Comparisons might be wrong.]) fi - $2COMPARABLE_ACTUAL_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", [$]1, [$]2, [$]3) }' <<< "[$]$1CC_VERSION_NUMBER"` + $2COMPARABLE_ACTUAL_VERSION=`$AWK -F. '{ printf("%05d%05d%05d%05d\n", [$]1, [$]2, [$]3, [$]4) }' <<< "[$]$1CC_VERSION_NUMBER"` ]) # Check if the configured compiler (C and C++) is of a specific version or @@ -94,8 +94,8 @@ # Need to assign to a variable since m4 is blocked from modifying parts in []. REFERENCE_VERSION=ARG_VERSION - if [ [[ "$REFERENCE_VERSION" =~ (.*\.){3} ]] ]; then - AC_MSG_ERROR([Internal error: Cannot compare to ARG_VERSION, only three parts (X.Y.Z) is supported]) + if [ [[ "$REFERENCE_VERSION" =~ (.*\.){4} ]] ]; then + AC_MSG_ERROR([Internal error: Cannot compare to ARG_VERSION, only four parts (W.X.Y.Z) is supported]) fi if [ [[ "$REFERENCE_VERSION" =~ [0-9]{6} ]] ]; then @@ -103,7 +103,7 @@ fi # Version comparison method inspired by http://stackoverflow.com/a/24067243 - COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d\n", [$]1, [$]2, [$]3) }' <<< "$REFERENCE_VERSION"` + COMPARABLE_REFERENCE_VERSION=`$AWK -F. '{ printf("%05d%05d%05d%05d\n", [$]1, [$]2, [$]3, [$]4) }' <<< "$REFERENCE_VERSION"` if test [$]ARG_PREFIX[COMPARABLE_ACTUAL_VERSION] -ge $COMPARABLE_REFERENCE_VERSION ; then : @@ -333,9 +333,11 @@ if test "x$TOOLCHAIN_TYPE" = xsolstudio; then # cc -V output typically looks like # cc: Sun C 5.12 Linux_i386 2011/11/16 + # or + # cc: Studio 12.5 Sun C 5.14 SunOS_sparc 2016/05/31 COMPILER_VERSION_OUTPUT=`$COMPILER -V 2>&1` # Check that this is likely to be the Solaris Studio cc. - $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null + $ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "^.* Sun $COMPILER_NAME" > /dev/null if test $? -ne 0; then ALT_VERSION_OUTPUT=`$COMPILER --version 2>&1` AC_MSG_NOTICE([The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required $TOOLCHAIN_TYPE compiler.]) @@ -827,7 +829,7 @@ BUILD_SYSROOT_CFLAGS="$SYSROOT_CFLAGS" BUILD_SYSROOT_LDFLAGS="$SYSROOT_LDFLAGS" BUILD_AR="$AR" - + TOOLCHAIN_PREPARE_FOR_VERSION_COMPARISONS([], [OPENJDK_BUILD_]) fi @@ -842,36 +844,6 @@ AC_SUBST(BUILD_AR) ]) -# Setup legacy variables that are still needed as alternative ways to refer to -# parts of the toolchain. -AC_DEFUN_ONCE([TOOLCHAIN_SETUP_LEGACY], -[ - if test "x$TOOLCHAIN_TYPE" = xmicrosoft; then - # For hotspot, we need these in Windows mixed path, - # so rewrite them all. Need added .exe suffix. - HOTSPOT_CXX="$CXX.exe" - HOTSPOT_LD="$LD.exe" - HOTSPOT_MT="$MT.exe" - HOTSPOT_RC="$RC.exe" - BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH(HOTSPOT_CXX) - BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH(HOTSPOT_LD) - BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH(HOTSPOT_MT) - BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH(HOTSPOT_RC) - AC_SUBST(HOTSPOT_MT) - AC_SUBST(HOTSPOT_RC) - else - HOTSPOT_CXX="$CXX" - HOTSPOT_LD="$LD" - fi - AC_SUBST(HOTSPOT_CXX) - AC_SUBST(HOTSPOT_LD) - - if test "x$TOOLCHAIN_TYPE" = xclang; then - USE_CLANG=true - fi - AC_SUBST(USE_CLANG) -]) - # Do some additional checks on the detected tools. AC_DEFUN_ONCE([TOOLCHAIN_MISC_CHECKS], [
--- a/common/autoconf/toolchain_windows.m4 Fri Dec 02 10:52:51 2016 -0800 +++ b/common/autoconf/toolchain_windows.m4 Wed Jul 05 22:32:06 2017 +0200 @@ -566,7 +566,7 @@ [path to microsoft C runtime dll (msvcr*.dll) (Windows only) @<:@probed@:>@])]) if test "x$with_msvcr_dll" != x; then - # If given explicitely by user, do not probe. If not present, fail directly. + # If given explicitly by user, do not probe. If not present, fail directly. TOOLCHAIN_CHECK_POSSIBLE_MSVC_DLL($MSVCR_NAME, [$with_msvcr_dll], [--with-msvcr-dll]) if test "x$MSVC_DLL" = x; then AC_MSG_ERROR([Could not find a proper $MSVCR_NAME as specified by --with-msvcr-dll]) @@ -589,7 +589,7 @@ if test "x$MSVCP_NAME" != "x"; then if test "x$with_msvcp_dll" != x; then - # If given explicitely by user, do not probe. If not present, fail directly. + # If given explicitly by user, do not probe. If not present, fail directly. TOOLCHAIN_CHECK_POSSIBLE_MSVC_DLL($MSVCP_NAME, [$with_msvcp_dll], [--with-msvcp-dll]) if test "x$MSVC_DLL" = x; then AC_MSG_ERROR([Could not find a proper $MSVCP_NAME as specified by --with-msvcp-dll])
--- a/common/bin/compare.sh Fri Dec 02 10:52:51 2016 -0800 +++ b/common/bin/compare.sh Wed Jul 05 22:32:06 2017 +0200 @@ -1295,8 +1295,8 @@ OTHER_JDK="$OTHER/images/jdk" OTHER_JRE="$OTHER/images/jre" echo "Selecting jdk images for compare" - elif [ -d "$(ls -d $THIS/licensee-src/build/*/images/jdk)" ] \ - && [ -d "$(ls -d $OTHER/licensee-src/build/*/images/jdk)" ] + elif [ -d "$(ls -d $THIS/licensee-src/build/*/images/jdk 2> /dev/null)" ] \ + && [ -d "$(ls -d $OTHER/licensee-src/build/*/images/jdk 2> /dev/null)" ] then echo "Selecting licensee images for compare" # Simply override the THIS and OTHER dir with the build dir from
--- a/common/conf/jib-profiles.js Fri Dec 02 10:52:51 2016 -0800 +++ b/common/conf/jib-profiles.js Wed Jul 05 22:32:06 2017 +0200 @@ -427,7 +427,7 @@ jtreg: { server: "javare", revision: "4.2", - build_number: "b03", + build_number: "b04", checksum_file: "MD5_VALUES", file: "jtreg_bin-4.2.zip", environment_name: "JT_HOME",
--- a/corba/.hgignore Fri Dec 02 10:52:51 2016 -0800 +++ b/corba/.hgignore Wed Jul 05 22:32:06 2017 +0200 @@ -2,5 +2,4 @@ ^dist/ ^webrev /nbproject/private/ -^.hgtip .DS_Store
--- a/corba/.hgtags Fri Dec 02 10:52:51 2016 -0800 +++ b/corba/.hgtags Wed Jul 05 22:32:06 2017 +0200 @@ -389,3 +389,4 @@ d4f1dae174098e799c48948e866054c52e11a186 jdk-9+144 a44b156ae7f06bf41b9bece30df7775e482395dd jdk-9+145 ecd74b41ab65bf228837b5bdf99690638d55425c jdk-9+146 +dc49e0922a8e4387cbf8670bbe1dc51c9874b74b jdk-9+147
--- a/corba/src/java.corba/share/classes/module-info.java Fri Dec 02 10:52:51 2016 -0800 +++ b/corba/src/java.corba/share/classes/module-info.java Wed Jul 05 22:32:06 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2016, 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 @@ -26,9 +26,10 @@ /** * Defines the Java binding of the OMG CORBA APIs, and the RMI-IIOP API. */ +@Deprecated(since="9", forRemoval=true) module java.corba { - requires public java.desktop; - requires public java.rmi; + requires transitive java.desktop; + requires transitive java.rmi; requires java.logging; requires java.naming; requires java.transaction; @@ -65,14 +66,13 @@ exports org.omg.PortableServer.portable; exports org.omg.SendingContext; exports org.omg.stub.java.rmi; - exports com.sun.corba.se.impl.util to - jdk.rmic; - exports com.sun.jndi.cosnaming to - java.naming; - exports com.sun.jndi.url.corbaname to - java.naming; - exports com.sun.jndi.url.iiop to - java.naming; - exports com.sun.jndi.url.iiopname to - java.naming; + + // rmic --iiop + exports com.sun.corba.se.impl.util to jdk.rmic; + + // JNDI CosNaming provider + opens com.sun.jndi.cosnaming to java.naming; // jndiprovider.properties + exports com.sun.jndi.url.corbaname to java.naming; + exports com.sun.jndi.url.iiop to java.naming; + exports com.sun.jndi.url.iiopname to java.naming; }
--- a/hotspot/.hgignore Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/.hgignore Wed Jul 05 22:32:06 2017 +0200 @@ -8,7 +8,6 @@ ^src/share/tools/IdealGraphVisualizer/dist/ ^src/share/tools/IdealGraphVisualizer/nbplatform/ .igv.log -^.hgtip .DS_Store ^\.mx.jvmci/env ^\.mx.jvmci/.*\.pyc
--- a/hotspot/.hgtags Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/.hgtags Wed Jul 05 22:32:06 2017 +0200 @@ -549,3 +549,4 @@ 6187b582d02aee38341dc8ce4011906e9b364e9f jdk-9+144 61e7ea56312351657e69198c503a6f7bf865af83 jdk-9+145 a82cb5350cad96a0b4de496afebe3ded89f27efa jdk-9+146 +132a72c782071cc11ab25cc7c9ee167c3632fea4 jdk-9+147
--- a/hotspot/make/symbols/symbols-unix Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/make/symbols/symbols-unix Wed Jul 05 22:32:06 2017 +0200 @@ -190,8 +190,6 @@ JVM_AddModuleExportsToAllUnnamed JVM_AddModulePackage JVM_AddReadsModule -JVM_CanReadModule JVM_DefineModule -JVM_IsExportedToModule JVM_SetBootLoaderUnnamedModule JVM_GetModuleByPackageName
--- a/hotspot/make/test/JtregNative.gmk Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/make/test/JtregNative.gmk Wed Jul 05 22:32:06 2017 +0200 @@ -55,6 +55,9 @@ $(HOTSPOT_TOPDIR)/test/compiler/calls \ $(HOTSPOT_TOPDIR)/test/compiler/native \ $(HOTSPOT_TOPDIR)/test/serviceability/jvmti/GetNamedModule \ + $(HOTSPOT_TOPDIR)/test/serviceability/jvmti/AddModuleReads \ + $(HOTSPOT_TOPDIR)/test/serviceability/jvmti/AddModuleExportsAndOpens \ + $(HOTSPOT_TOPDIR)/test/serviceability/jvmti/AddModuleUsesAndProvides \ $(HOTSPOT_TOPDIR)/test/testlibrary/jvmti \ $(HOTSPOT_TOPDIR)/test/compiler/jvmci/jdk.vm.ci.code.test \ $(HOTSPOT_TOPDIR)/test/serviceability/jvmti/GetModulesInfo \ @@ -81,6 +84,9 @@ BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_liboverflow := -lc BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libSimpleClassFileLoadHook := -lc BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libGetNamedModuleTest := -lc + BUILD_HOTSPOT_JTREG_LIBRARIES_LDFLAGS_libAddModuleReadsTest := -lc + BUILD_HOTSPOT_JTREG_LIBRARIES_LDFLAGS_libAddModuleExportsAndOpensTest := -lc + BUILD_HOTSPOT_JTREG_LIBRARIES_LDFLAGS_libAddModuleUsesAndProvidesTest := -lc BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libMAAClassFileLoadHook := -lc BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libMAAClassLoadPrepare := -lc BUILD_HOTSPOT_JTREG_LIBRARIES_LIBS_libMAAThreadStart := -lc
--- a/hotspot/src/jdk.vm.ci/share/classes/module-info.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/jdk.vm.ci/share/classes/module-info.java Wed Jul 05 22:32:06 2017 +0200 @@ -30,9 +30,7 @@ uses jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory; provides jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory with - jdk.vm.ci.hotspot.aarch64.AArch64HotSpotJVMCIBackendFactory; - provides jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory with - jdk.vm.ci.hotspot.amd64.AMD64HotSpotJVMCIBackendFactory; - provides jdk.vm.ci.hotspot.HotSpotJVMCIBackendFactory with + jdk.vm.ci.hotspot.aarch64.AArch64HotSpotJVMCIBackendFactory, + jdk.vm.ci.hotspot.amd64.AMD64HotSpotJVMCIBackendFactory, jdk.vm.ci.hotspot.sparc.SPARCHotSpotJVMCIBackendFactory; }
--- a/hotspot/src/share/vm/classfile/moduleEntry.hpp Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/classfile/moduleEntry.hpp Wed Jul 05 22:32:06 2017 +0200 @@ -36,6 +36,8 @@ #include "utilities/ostream.hpp" #define UNNAMED_MODULE "Unnamed Module" +#define JAVAPKG "java/" +#define JAVAPKG_LEN 5 class ModuleClosure;
--- a/hotspot/src/share/vm/classfile/modules.cpp Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/classfile/modules.cpp Wed Jul 05 22:32:06 2017 +0200 @@ -34,6 +34,7 @@ #include "classfile/packageEntry.hpp" #include "classfile/stringTable.hpp" #include "classfile/symbolTable.hpp" +#include "classfile/systemDictionary.hpp" #include "classfile/vmSymbols.hpp" #include "logging/log.hpp" #include "memory/resourceArea.hpp" @@ -44,6 +45,7 @@ #include "runtime/handles.inline.hpp" #include "runtime/javaCalls.hpp" #include "runtime/reflection.hpp" +#include "utilities/stringUtils.hpp" #include "utilities/utf8.hpp" static bool verify_module_name(char *module_name) { @@ -290,6 +292,14 @@ const char* module_version = get_module_version(version); + oop loader = java_lang_reflect_Module::loader(module_handle()); + // Make sure loader is not the jdk.internal.reflect.DelegatingClassLoader. + if (loader != java_lang_ClassLoader::non_reflection_class_loader(loader)) { + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), + "Class loader is an invalid delegating class loader"); + } + Handle h_loader = Handle(THREAD, loader); + objArrayOop packages_oop = objArrayOop(JNIHandles::resolve(packages)); objArrayHandle packages_h(THREAD, packages_oop); int num_packages = (packages_h == NULL ? 0 : packages_h->length()); @@ -310,6 +320,21 @@ err_msg("Invalid package name: %s for module: %s", package_name, module_name)); } + + // Only modules defined to either the boot or platform class loader, can define a "java/" package. + if (!h_loader.is_null() && + !SystemDictionary::is_platform_class_loader(h_loader) && + strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0) { + const char* class_loader_name = SystemDictionary::loader_name(h_loader()); + StringUtils::replace_no_expand(package_name, "/", "."); + const char* msg_text1 = "Class loader (instance of): "; + const char* msg_text2 = " tried to define prohibited package name: "; + size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(package_name) + 1; + char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len); + jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, package_name); + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), message); + } + Symbol* pkg_symbol = SymbolTable::new_symbol(package_name, CHECK); // append_if_missing() returns FALSE if entry already exists. if (!pkg_list->append_if_missing(pkg_symbol)) { @@ -319,20 +344,6 @@ } } - oop loader = java_lang_reflect_Module::loader(module_handle()); - // Make sure loader is not the sun.reflect.DelegatingClassLoader. - if (loader != java_lang_ClassLoader::non_reflection_class_loader(loader)) { - THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), - "Class loader is an invalid delegating class loader"); - } - Handle h_loader = Handle(THREAD, loader); - - // Check that loader is a subclass of java.lang.ClassLoader. - if (loader != NULL && !java_lang_ClassLoader::is_subclass(h_loader->klass())) { - THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), - "Class loader is not a subclass of java.lang.ClassLoader"); - } - ModuleEntryTable* module_table = get_module_entry_table(h_loader, CHECK); assert(module_table != NULL, "module entry table shouldn't be null"); @@ -595,122 +606,6 @@ } } -jboolean Modules::can_read_module(jobject asking_module, jobject target_module, TRAPS) { - if (asking_module == NULL) { - THROW_MSG_(vmSymbols::java_lang_NullPointerException(), - "asking_module is null", JNI_FALSE); - } - - ModuleEntry* asking_module_entry = get_module_entry(asking_module, CHECK_false); - if (asking_module_entry == NULL) { - THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), - "asking_module is invalid", JNI_FALSE); - } - - // Calling can_read_all_unnamed() with NULL tests if a module is loose. - if (target_module == NULL) { - return asking_module_entry->can_read_all_unnamed(); - } - - ModuleEntry* target_module_entry = get_module_entry(target_module, CHECK_false); - if (target_module_entry == NULL) { - THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), - "target_module is invalid", JNI_FALSE); - } - - ResourceMark rm(THREAD); - log_debug(modules)("can_read_module(): module %s trying to read module %s, allowed = %s", - asking_module_entry->is_named() ? - asking_module_entry->name()->as_C_string() : UNNAMED_MODULE, - target_module_entry->is_named() ? - target_module_entry->name()->as_C_string() : UNNAMED_MODULE, - BOOL_TO_STR(asking_module_entry == target_module_entry || - (asking_module_entry->can_read_all_unnamed() && - !target_module_entry->is_named()) || - asking_module_entry->can_read(target_module_entry))); - - // Return true if: - // 1. the modules are the same, or - // 2. the asking_module is unnamed (because unnamed modules read everybody), or - // 3. the asking_module is loose and the target module is unnamed, or - // 4. if can_read() returns true. - if (asking_module_entry == target_module_entry || - (asking_module_entry->can_read_all_unnamed() && !target_module_entry->is_named())) { - return true; - } - return asking_module_entry->can_read(target_module_entry); -} - -jboolean Modules::is_exported_to_module(jobject from_module, jstring package, - jobject to_module, TRAPS) { - if (package == NULL) { - THROW_MSG_(vmSymbols::java_lang_NullPointerException(), - "package is null", JNI_FALSE); - } - if (from_module == NULL) { - THROW_MSG_(vmSymbols::java_lang_NullPointerException(), - "from_module is null", JNI_FALSE); - } - ModuleEntry* from_module_entry = get_module_entry(from_module, CHECK_false); - if (from_module_entry == NULL) { - THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), - "from_module is invalid", JNI_FALSE); - } - ModuleEntry* to_module_entry; - if (to_module == NULL) { - THROW_MSG_(vmSymbols::java_lang_NullPointerException(), - "to_module is null", JNI_FALSE); - } - to_module_entry = get_module_entry(to_module, CHECK_false); - if (to_module_entry == NULL) { - THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), - "to_module is invalid", JNI_FALSE); - } - - PackageEntry *package_entry = get_package_entry(from_module_entry, package, - CHECK_false); - ResourceMark rm(THREAD); - if (package_entry == NULL) { - THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), - err_msg("Package not found in from_module: %s", - from_module_entry->is_named() ? - from_module_entry->name()->as_C_string() : UNNAMED_MODULE), - JNI_FALSE); - } - if (package_entry->module() != from_module_entry) { - THROW_MSG_(vmSymbols::java_lang_IllegalArgumentException(), - err_msg("Package: %s found in module %s, not in from_module: %s", - package_entry->name()->as_C_string(), - package_entry->module()->is_named() ? - package_entry->module()->name()->as_C_string() : UNNAMED_MODULE, - from_module_entry->is_named() ? - from_module_entry->name()->as_C_string() : UNNAMED_MODULE), - JNI_FALSE); - } - - log_debug(modules)("is_exported_to_module: package %s from module %s checking" - " if exported to module %s, exported? = %s", - package_entry->name()->as_C_string(), - from_module_entry->is_named() ? - from_module_entry->name()->as_C_string() : UNNAMED_MODULE, - to_module_entry->is_named() ? - to_module_entry->name()->as_C_string() : UNNAMED_MODULE, - BOOL_TO_STR(!from_module_entry->is_named() || - package_entry->is_unqual_exported() || - from_module_entry == to_module_entry || - package_entry->is_qexported_to(to_module_entry))); - - // Return true if: - // 1. from_module is unnamed because unnamed modules export all their packages (by default), or - // 2. if the package is unqualifiedly exported, or - // 3. if the modules are the same, or - // 4. if the package is exported to to_module - return (!from_module_entry->is_named() || - package_entry->is_unqual_exported() || - from_module_entry == to_module_entry || - package_entry->is_qexported_to(to_module_entry)); -} - // This method is called by JFR and JNI. jobject Modules::get_module(jclass clazz, TRAPS) { assert(ModuleEntryTable::javabase_defined(), "Attempt to call get_module before java.base is defined"); @@ -860,11 +755,27 @@ err_msg("Invalid package name: %s", package_name)); } + ClassLoaderData *loader_data = module_entry->loader_data(); + + // Only modules defined to either the boot or platform class loader, can define a "java/" package. + if (!loader_data->is_the_null_class_loader_data() && + !loader_data->is_platform_class_loader_data() && + strncmp(package_name, JAVAPKG, JAVAPKG_LEN) == 0) { + const char* class_loader_name = SystemDictionary::loader_name(loader_data); + StringUtils::replace_no_expand(package_name, "/", "."); + const char* msg_text1 = "Class loader (instance of): "; + const char* msg_text2 = " tried to define prohibited package name: "; + size_t len = strlen(msg_text1) + strlen(class_loader_name) + strlen(msg_text2) + strlen(package_name) + 1; + char* message = NEW_RESOURCE_ARRAY_IN_THREAD(THREAD, char, len); + jio_snprintf(message, len, "%s%s%s%s", msg_text1, class_loader_name, msg_text2, package_name); + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), message); + } + log_debug(modules)("add_module_package(): Adding package %s to module %s", package_name, module_entry->name()->as_C_string()); TempNewSymbol pkg_symbol = SymbolTable::new_symbol(package_name, CHECK); - PackageEntryTable* package_table = module_entry->loader_data()->packages(); + PackageEntryTable* package_table = loader_data->packages(); assert(package_table != NULL, "Missing package_table"); bool pkg_exists = false;
--- a/hotspot/src/share/vm/classfile/modules.hpp Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/classfile/modules.hpp Wed Jul 05 22:32:06 2017 +0200 @@ -93,24 +93,6 @@ // module does not exist. static void add_reads_module(jobject from_module, jobject to_module, TRAPS); - // can_read_module returns TRUE if module asking_module can read module target_module, - // or if they are the same module, or if the asking_module is loose and target_module - // is null. - // - // Throws IllegalArgumentException if: - // * either asking_module or target_module is not a java.lang.reflect.Module - static jboolean can_read_module(jobject asking_module, jobject target_module, TRAPS); - - // If package is valid then this returns TRUE if module from_module exports - // package to module to_module, if from_module and to_module are the same - // module, or if package is exported without qualification. - // - // IllegalArgumentException is throw if: - // * Either to_module or from_module does not exist - // * package is syntactically incorrect - // * package is not in from_module - static jboolean is_exported_to_module(jobject from_module, jstring package, jobject to_module, TRAPS); - // Return the java.lang.reflect.Module object for this class object. static jobject get_module(jclass clazz, TRAPS);
--- a/hotspot/src/share/vm/classfile/vmSymbols.hpp Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp Wed Jul 05 22:32:06 2017 +0200 @@ -451,8 +451,6 @@ template(loader_name, "loader") \ template(module_name, "module") \ template(getModule_name, "getModule") \ - template(addReads_name, "addReads") \ - template(addReads_signature, "(Ljava/lang/reflect/Module;Ljava/lang/reflect/Module;)V") \ template(input_stream_void_signature, "(Ljava/io/InputStream;)V") \ template(definePackage_name, "definePackage") \ template(definePackage_signature, "(Ljava/lang/String;Ljava/lang/reflect/Module;)Ljava/lang/Package;") \ @@ -645,6 +643,15 @@ /* JVMTI/java.lang.instrument support and VM Attach mechanism */ \ template(jdk_internal_module_Modules, "jdk/internal/module/Modules") \ template(jdk_internal_vm_VMSupport, "jdk/internal/vm/VMSupport") \ + template(addReads_name, "addReads") \ + template(addReads_signature, "(Ljava/lang/reflect/Module;Ljava/lang/reflect/Module;)V") \ + template(addExports_name, "addExports") \ + template(addOpens_name, "addOpens") \ + template(addExports_signature, "(Ljava/lang/reflect/Module;Ljava/lang/String;Ljava/lang/reflect/Module;)V") \ + template(addUses_name, "addUses") \ + template(addUses_signature, "(Ljava/lang/reflect/Module;Ljava/lang/Class;)V") \ + template(addProvides_name, "addProvides") \ + template(addProvides_signature, "(Ljava/lang/reflect/Module;Ljava/lang/Class;Ljava/lang/Class;)V") \ template(transformedByAgent_name, "transformedByAgent") \ template(transformedByAgent_signature, "(Ljava/lang/reflect/Module;)V") \ template(appendToClassPathForInstrumentation_name, "appendToClassPathForInstrumentation") \
--- a/hotspot/src/share/vm/oops/instanceKlass.cpp Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/oops/instanceKlass.cpp Wed Jul 05 22:32:06 2017 +0200 @@ -26,6 +26,7 @@ #include "classfile/classFileParser.hpp" #include "classfile/classFileStream.hpp" #include "classfile/javaClasses.hpp" +#include "classfile/moduleEntry.hpp" #include "classfile/systemDictionary.hpp" #include "classfile/systemDictionaryShared.hpp" #include "classfile/verifier.hpp" @@ -2383,18 +2384,17 @@ // Only boot and platform class loaders can define classes in "java/" packages. void InstanceKlass::check_prohibited_package(Symbol* class_name, - Handle class_loader, - TRAPS) { - const char* javapkg = "java/"; + Handle class_loader, + TRAPS) { ResourceMark rm(THREAD); if (!class_loader.is_null() && !SystemDictionary::is_platform_class_loader(class_loader) && class_name != NULL && - strncmp(class_name->as_C_string(), javapkg, strlen(javapkg)) == 0) { + strncmp(class_name->as_C_string(), JAVAPKG, JAVAPKG_LEN) == 0) { TempNewSymbol pkg_name = InstanceKlass::package_from_name(class_name, CHECK); assert(pkg_name != NULL, "Error in parsing package name starting with 'java/'"); char* name = pkg_name->as_C_string(); - const char* class_loader_name = InstanceKlass::cast(class_loader()->klass())->name()->as_C_string(); + const char* class_loader_name = SystemDictionary::loader_name(class_loader()); StringUtils::replace_no_expand(name, "/", "."); const char* msg_text1 = "Class loader (instance of): "; const char* msg_text2 = " tried to load prohibited package name: ";
--- a/hotspot/src/share/vm/prims/jni.cpp Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/prims/jni.cpp Wed Jul 05 22:32:06 2017 +0200 @@ -3475,40 +3475,6 @@ JNI_END -JNI_ENTRY(void, jni_AddModuleReads(JNIEnv* env, jobject m1, jobject m2)) - JNIWrapper("AddModuleReads"); - if (m1 == NULL || m2 == NULL) { - THROW(vmSymbols::java_lang_NullPointerException()); - } - JavaValue result(T_VOID); - Handle m1_h(THREAD, JNIHandles::resolve(m1)); - if (!java_lang_reflect_Module::is_instance(m1_h())) { - THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Bad m1 object"); - } - Handle m2_h(THREAD, JNIHandles::resolve(m2)); - if (!java_lang_reflect_Module::is_instance(m2_h())) { - THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), "Bad m2 object"); - } - JavaCalls::call_static(&result, - KlassHandle(THREAD, SystemDictionary::module_Modules_klass()), - vmSymbols::addReads_name(), - vmSymbols::addReads_signature(), - m1_h, - m2_h, - THREAD); -JNI_END - - -JNI_ENTRY(jboolean, jni_CanReadModule(JNIEnv* env, jobject m1, jobject m2)) - JNIWrapper("CanReadModule"); - if (m1 == NULL || m2 == NULL) { - THROW_(vmSymbols::java_lang_NullPointerException(), JNI_FALSE); - } - jboolean res = Modules::can_read_module(m1, m2, CHECK_false); - return res; -JNI_END - - // Structure containing all jni functions struct JNINativeInterface_ jni_NativeInterface = { NULL, @@ -3792,9 +3758,7 @@ // Module features - jni_GetModule, - jni_AddModuleReads, - jni_CanReadModule + jni_GetModule };
--- a/hotspot/src/share/vm/prims/jni.h Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/prims/jni.h Wed Jul 05 22:32:06 2017 +0200 @@ -770,12 +770,6 @@ jobject (JNICALL *GetModule) (JNIEnv* env, jclass clazz); - - void (JNICALL *AddModuleReads) - (JNIEnv* env, jobject m1, jobject m2); - - jboolean (JNICALL *CanReadModule) - (JNIEnv* env, jobject m1, jobject m2); }; /* @@ -1874,14 +1868,6 @@ return functions->GetModule(this, clazz); } - void AddModuleReads(jobject fromModule, jobject sourceModule) { - functions->AddModuleReads(this, fromModule, sourceModule); - } - - jboolean CanReadModule(jobject askingModule, jobject sourceModule) { - return functions->CanReadModule(this, askingModule, sourceModule); - } - #endif /* __cplusplus */ };
--- a/hotspot/src/share/vm/prims/jniCheck.cpp Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/prims/jniCheck.cpp Wed Jul 05 22:32:06 2017 +0200 @@ -2001,37 +2001,6 @@ return result; JNI_END -JNI_ENTRY_CHECKED(void, - checked_jni_AddModuleReads(JNIEnv *env, - jobject fromModule, - jobject sourceModule)) - functionEnter(thr); - IN_VM( - jniCheck::validate_object(thr, fromModule); - if (sourceModule != NULL) { - jniCheck::validate_object(thr, sourceModule); - } - ) - UNCHECKED()->AddModuleReads(env,fromModule,sourceModule); - functionExit(thr); -JNI_END - -JNI_ENTRY_CHECKED(jboolean, - checked_jni_CanReadModule(JNIEnv *env, - jobject askingModule, - jobject sourceModule)) - functionEnter(thr); - IN_VM( - jniCheck::validate_object(thr, askingModule); - if (sourceModule != NULL) { - jniCheck::validate_object(thr, sourceModule); - } - ) - jboolean result = UNCHECKED()->CanReadModule(env,askingModule,sourceModule); - functionExit(thr); - return result; -JNI_END - /* * Structure containing all checked jni functions */ @@ -2317,9 +2286,7 @@ // Module Features - checked_jni_GetModule, - checked_jni_AddModuleReads, - checked_jni_CanReadModule + checked_jni_GetModule };
--- a/hotspot/src/share/vm/prims/jvm.cpp Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/prims/jvm.cpp Wed Jul 05 22:32:06 2017 +0200 @@ -1008,8 +1008,8 @@ // Module support ////////////////////////////////////////////////////////////////////////////// -JVM_ENTRY(void, JVM_DefineModule(JNIEnv *env, jobject module, jstring version, jstring location, - jobjectArray packages)) +JVM_ENTRY(void, JVM_DefineModule(JNIEnv *env, jobject module, jboolean is_open, jstring version, + jstring location, jobjectArray packages)) JVMWrapper("JVM_DefineModule"); Modules::define_module(module, version, location, packages, CHECK); JVM_END @@ -1039,16 +1039,6 @@ Modules::add_reads_module(from_module, source_module, CHECK); JVM_END -JVM_ENTRY(jboolean, JVM_CanReadModule(JNIEnv *env, jobject asking_module, jobject source_module)) - JVMWrapper("JVM_CanReadModule"); - return Modules::can_read_module(asking_module, source_module, THREAD); -JVM_END - -JVM_ENTRY(jboolean, JVM_IsExportedToModule(JNIEnv *env, jobject from_module, jstring package, jobject to_module)) - JVMWrapper("JVM_IsExportedToModule"); - return Modules::is_exported_to_module(from_module, package, to_module, THREAD); -JVM_END - JVM_ENTRY (void, JVM_AddModulePackage(JNIEnv *env, jobject module, jstring package)) JVMWrapper("JVM_AddModulePackage"); Modules::add_module_package(module, package, CHECK);
--- a/hotspot/src/share/vm/prims/jvm.h Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/prims/jvm.h Wed Jul 05 22:32:06 2017 +0200 @@ -413,8 +413,8 @@ */ JNIEXPORT void JNICALL -JVM_DefineModule(JNIEnv *env, jobject module, jstring version, jstring location, - jobjectArray packages); +JVM_DefineModule(JNIEnv *env, jobject module, jboolean is_open, jstring version, + jstring location, jobjectArray packages); JNIEXPORT void JNICALL JVM_SetBootLoaderUnnamedModule(JNIEnv *env, jobject module); @@ -431,12 +431,6 @@ JNIEXPORT void JNICALL JVM_AddReadsModule(JNIEnv *env, jobject from_module, jobject source_module); -JNIEXPORT jboolean JNICALL -JVM_CanReadModule(JNIEnv *env, jobject asking_module, jobject source_module); - -JNIEXPORT jboolean JNICALL -JVM_IsExportedToModule(JNIEnv *env, jobject from_module, jstring package, jobject to_module); - JNIEXPORT void JNICALL JVM_AddModulePackage(JNIEnv* env, jobject module, jstring package);
--- a/hotspot/src/share/vm/prims/jvmti.xml Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/prims/jvmti.xml Wed Jul 05 22:32:06 2017 +0200 @@ -863,14 +863,12 @@ </intro> <intro id="bcimodules" label="Bytecode Instrumentation of code in modules"> - Agents that instrument code in named modules may need to arrange for those - modules to read other modules. If code is instrumented to invoke a method - in a support class in another module, then the module of the instrumented - code should read the module of the supporting class. Furthermore, the - supporting class will only be accessible to the instrumented code if - it is <code>public</code> and in a package that is exported by its module. - Agents can use the JNI functions <code>CanReadModule</code> and - <code>AddModuleReads</code> to test and update a module to read another. + Agents can use the functions <functionlink id="AddModuleReads"/>, + <functionlink id="AddModuleExports"/>, <functionlink id="AddModuleOpens"/>, + <functionlink id="AddModuleUses"/> and <functionlink id="AddModuleProvides"/> + to update a module to expand the set of modules that it reads, the set of + packages that it exports or opens to other modules, or the services that it + uses and provides. <p/> As an aid to agents that deploy supporting classes on the search path of the bootstrap class loader, or the search path of the class loader that @@ -6561,6 +6559,227 @@ </error> </errors> </function> + + <function id="AddModuleReads" num="94" since="9"> + <synopsis>Add Module Reads</synopsis> + <description> + Update a module to read another module. This function is a no-op + when <paramlink id="module"></paramlink> is an unnamed module. + This function facilitates the instrumentation of code + in named modules where that instrumentation requires + expanding the set of modules that a module reads. + </description> + <origin>new</origin> + <capabilities> + </capabilities> + <parameters> + <param id="module"> + <ptrtype><jobject/></ptrtype> + <description> + The module to update. + </description> + </param> + <param id="to_module"> + <ptrtype><jobject/></ptrtype> + <description> + The additional module to read. + </description> + </param> + </parameters> + <errors> + <error id="JVMTI_ERROR_INVALID_MODULE"> + If <paramlink id="module"></paramlink> is not a module object. + </error> + <error id="JVMTI_ERROR_INVALID_MODULE"> + If <paramlink id="to_module"></paramlink> is not a module object. + </error> + </errors> + </function> + + <function id="AddModuleExports" num="95" since="9"> + <synopsis>Add Module Exports</synopsis> + <description> + Update a module to export a package to another module. + This function is a no-op when <paramlink id="module"></paramlink> + is an unnamed module or an open module. + This function facilitates the instrumentation of code + in named modules where that instrumentation requires + expanding the set of packages that a module exports. + </description> + <origin>new</origin> + <capabilities> + </capabilities> + <parameters> + <param id="module"> + <ptrtype><jobject/></ptrtype> + <description> + The module to update. + </description> + </param> + <param id="pkg_name"> + <inbuf><char/></inbuf> + <description> + The exported package name. + </description> + </param> + <param id="to_module"> + <ptrtype><jobject/></ptrtype> + <description> + The module the package is exported to. + If the <code>to_module</code> is not a subclass of + <code>java.lang.reflect.Module</code> this function returns + <errorlink id="JVMTI_ERROR_INVALID_MODULE"></errorlink>. + </description> + </param> + </parameters> + <errors> + <error id="JVMTI_ERROR_INVALID_MODULE"> + If <paramlink id="module"></paramlink> is not a module object. + </error> + <error id="JVMTI_ERROR_INVALID_MODULE"> + If <paramlink id="to_modules"></paramlink> is not a module object. + </error> + <error id="JVMTI_ERROR_ILLEGAL_ARGUMENT"> + If the package <paramlink id="pkg_name"></paramlink> + does not belong to the module. + </error> + </errors> + </function> + + <function id="AddModuleOpens" num="96" since="9"> + <synopsis>Add Module Opens</synopsis> + <description> + Update a module to open a package to another module. + This function is a no-op when <paramlink id="module"></paramlink> + is an unnamed module or an open module. + This function facilitates the instrumentation of code + in modules where that instrumentation requires + expanding the set of packages that a module opens to + other modules. + </description> + <origin>new</origin> + <capabilities> + </capabilities> + <parameters> + <param id="module"> + <ptrtype><jobject/></ptrtype> + <description> + The module to update. + </description> + </param> + <param id="pkg_name"> + <inbuf><char/></inbuf> + <description> + The package name of the package to open. + </description> + </param> + <param id="to_module"> + <ptrtype><jobject/></ptrtype> + <description> + The module with the package to open. + If the <code>to_module</code> is not a subclass of + <code>java.lang.reflect.Module</code> this function returns + <errorlink id="JVMTI_ERROR_INVALID_MODULE"></errorlink>. + </description> + </param> + </parameters> + <errors> + <error id="JVMTI_ERROR_INVALID_MODULE"> + If <paramlink id="module"></paramlink> is not a module object. + </error> + <error id="JVMTI_ERROR_INVALID_MODULE"> + If <paramlink id="to_modules"></paramlink> is not a module object. + </error> + <error id="JVMTI_ERROR_ILLEGAL_ARGUMENT"> + If the package <paramlink id="pkg_name"></paramlink> + does not belong to the module. + </error> + </errors> + </function> + + <function id="AddModuleUses" num="97" since="9"> + <synopsis>Add Module Uses</synopsis> + <description> + Updates a module to add a service to the set of services that + a module uses. This function is a no-op when the module + is an unnamed module. + This function facilitates the instrumentation of code + in named modules where that instrumentation requires + expanding the set of services that a module is using. + </description> + <origin>new</origin> + <capabilities> + </capabilities> + <parameters> + <param id="module"> + <ptrtype><jobject/></ptrtype> + <description> + The module to update. + </description> + </param> + <param id="service"> + <ptrtype><jclass/></ptrtype> + <description> + The service to use. + </description> + </param> + </parameters> + <errors> + <error id="JVMTI_ERROR_INVALID_MODULE"> + If <paramlink id="module"></paramlink> is not a module object. + </error> + <error id="JVMTI_ERROR_INVALID_CLASS"> + If <paramlink id="service"></paramlink> is not a class object. + </error> + </errors> + </function> + + <function id="AddModuleProvides" num="98" since="9"> + <synopsis>Add Module Provides</synopsis> + <description> + Updates a module to add a service to the set of services that + a module provides. This function is a no-op when the module + is an unnamed module. + This function facilitates the instrumentation of code + in named modules where that instrumentation requires + changes to the services that are provided. + </description> + <origin>new</origin> + <capabilities> + </capabilities> + <parameters> + <param id="module"> + <ptrtype><jobject/></ptrtype> + <description> + The module to update. + </description> + </param> + <param id="service"> + <ptrtype><jclass/></ptrtype> + <description> + The service to provide. + </description> + </param> + <param id="impl_class"> + <ptrtype><jclass/></ptrtype> + <description> + The implementation class for the provided service. + </description> + </param> + </parameters> + <errors> + <error id="JVMTI_ERROR_INVALID_MODULE"> + If <paramlink id="module"></paramlink> is not a module object. + </error> + <error id="JVMTI_ERROR_INVALID_CLASS"> + If <paramlink id="service"></paramlink> is not a class object. + </error> + <error id="JVMTI_ERROR_INVALID_CLASS"> + If <paramlink id="impl_class"></paramlink> is not a class object. + </error> + </errors> + </function> + </category> <category id="class" label="Class"> @@ -11371,6 +11590,9 @@ <errorid id="JVMTI_ERROR_INVALID_FIELDID" num="25"> Invalid field. </errorid> + <errorid id="JVMTI_ERROR_INVALID_MODULE" num="26"> + Invalid module. + </errorid> <errorid id="JVMTI_ERROR_INVALID_METHODID" num="23"> Invalid method. </errorid> @@ -14492,17 +14714,17 @@ <change date="19 June 2013" version="1.2.3"> Added support for statically linked agents. </change> - <change date="5 July 2016" version="9.0.0"> + <change date="13 October 2016" version="9.0.0"> Support for modules: - The majorversion is 9 now - The ClassFileLoadHook events are not sent during the primordial phase anymore. - - Add new function GetAllModules - - Add new capability can_generate_early_vmstart - Allow CompiledMethodLoad events at start phase - - Add new capability can_generate_early_class_hook_events - - Add new function GetNamedModule - </change> - <change date="16 August 2016" version="9.0.0"> + - Add new capabilities: + - can_generate_early_vmstart + - can_generate_early_class_hook_events + - Add new functions: + - GetAllModules + - AddModuleReads, AddModuleExports, AddModuleOpens, AddModuleUses, AddModuleProvides Clarified can_redefine_any_classes, can_retransform_any_classes and IsModifiableClass API to disallow some implementation defined classes. </change>
--- a/hotspot/src/share/vm/prims/jvmtiEnv.cpp Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/prims/jvmtiEnv.cpp Wed Jul 05 22:32:06 2017 +0200 @@ -227,6 +227,119 @@ } /* end GetNamedModule */ +// module - pre-checked for NULL +// to_module - pre-checked for NULL +jvmtiError +JvmtiEnv::AddModuleReads(jobject module, jobject to_module) { + JavaThread* THREAD = JavaThread::current(); + + // check module + Handle h_module(THREAD, JNIHandles::resolve(module)); + if (!java_lang_reflect_Module::is_instance(h_module())) { + return JVMTI_ERROR_INVALID_MODULE; + } + // check to_module + Handle h_to_module(THREAD, JNIHandles::resolve(to_module)); + if (!java_lang_reflect_Module::is_instance(h_to_module())) { + return JVMTI_ERROR_INVALID_MODULE; + } + return JvmtiExport::add_module_reads(h_module, h_to_module, THREAD); +} /* end AddModuleReads */ + + +// module - pre-checked for NULL +// pkg_name - pre-checked for NULL +// to_module - pre-checked for NULL +jvmtiError +JvmtiEnv::AddModuleExports(jobject module, const char* pkg_name, jobject to_module) { + JavaThread* THREAD = JavaThread::current(); + Handle h_pkg = java_lang_String::create_from_str(pkg_name, THREAD); + + // check module + Handle h_module(THREAD, JNIHandles::resolve(module)); + if (!java_lang_reflect_Module::is_instance(h_module())) { + return JVMTI_ERROR_INVALID_MODULE; + } + // check to_module + Handle h_to_module(THREAD, JNIHandles::resolve(to_module)); + if (!java_lang_reflect_Module::is_instance(h_to_module())) { + return JVMTI_ERROR_INVALID_MODULE; + } + return JvmtiExport::add_module_exports(h_module, h_pkg, h_to_module, THREAD); +} /* end AddModuleExports */ + + +// module - pre-checked for NULL +// pkg_name - pre-checked for NULL +// to_module - pre-checked for NULL +jvmtiError +JvmtiEnv::AddModuleOpens(jobject module, const char* pkg_name, jobject to_module) { + JavaThread* THREAD = JavaThread::current(); + Handle h_pkg = java_lang_String::create_from_str(pkg_name, THREAD); + + // check module + Handle h_module(THREAD, JNIHandles::resolve(module)); + if (!java_lang_reflect_Module::is_instance(h_module())) { + return JVMTI_ERROR_INVALID_MODULE; + } + // check to_module + Handle h_to_module(THREAD, JNIHandles::resolve(to_module)); + if (!java_lang_reflect_Module::is_instance(h_to_module())) { + return JVMTI_ERROR_INVALID_MODULE; + } + return JvmtiExport::add_module_opens(h_module, h_pkg, h_to_module, THREAD); +} /* end AddModuleOpens */ + + +// module - pre-checked for NULL +// service - pre-checked for NULL +jvmtiError +JvmtiEnv::AddModuleUses(jobject module, jclass service) { + JavaThread* THREAD = JavaThread::current(); + + // check module + Handle h_module(THREAD, JNIHandles::resolve(module)); + if (!java_lang_reflect_Module::is_instance(h_module())) { + return JVMTI_ERROR_INVALID_MODULE; + } + // check service + Handle h_service(THREAD, JNIHandles::resolve_external_guard(service)); + if (!java_lang_Class::is_instance(h_service()) || + java_lang_Class::is_primitive(h_service())) { + return JVMTI_ERROR_INVALID_CLASS; + } + return JvmtiExport::add_module_uses(h_module, h_service, THREAD); +} /* end AddModuleUses */ + + +// module - pre-checked for NULL +// service - pre-checked for NULL +// impl_class - pre-checked for NULL +jvmtiError +JvmtiEnv::AddModuleProvides(jobject module, jclass service, jclass impl_class) { + JavaThread* THREAD = JavaThread::current(); + + // check module + Handle h_module(THREAD, JNIHandles::resolve(module)); + if (!java_lang_reflect_Module::is_instance(h_module())) { + return JVMTI_ERROR_INVALID_MODULE; + } + // check service + Handle h_service(THREAD, JNIHandles::resolve_external_guard(service)); + if (!java_lang_Class::is_instance(h_service()) || + java_lang_Class::is_primitive(h_service())) { + return JVMTI_ERROR_INVALID_CLASS; + } + // check impl_class + Handle h_impl_class(THREAD, JNIHandles::resolve_external_guard(impl_class)); + if (!java_lang_Class::is_instance(h_impl_class()) || + java_lang_Class::is_primitive(h_impl_class())) { + return JVMTI_ERROR_INVALID_CLASS; + } + return JvmtiExport::add_module_provides(h_module, h_service, h_impl_class, THREAD); +} /* end AddModuleProvides */ + + // // Class functions //
--- a/hotspot/src/share/vm/prims/jvmtiExport.cpp Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/prims/jvmtiExport.cpp Wed Jul 05 22:32:06 2017 +0200 @@ -434,6 +434,165 @@ } } +jvmtiError +JvmtiExport::add_module_reads(Handle module, Handle to_module, TRAPS) { + if (!Universe::is_module_initialized()) { + return JVMTI_ERROR_NONE; // extra safety + } + assert(!module.is_null(), "module should always be set"); + assert(!to_module.is_null(), "to_module should always be set"); + + // Invoke the addReads method + JavaValue result(T_VOID); + JavaCalls::call_static(&result, + SystemDictionary::module_Modules_klass(), + vmSymbols::addReads_name(), + vmSymbols::addReads_signature(), + module, + to_module, + THREAD); + + if (HAS_PENDING_EXCEPTION) { + LogTarget(Trace, jvmti) log; + LogStreamCHeap log_stream(log); + java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream); + log_stream.cr(); + CLEAR_PENDING_EXCEPTION; + return JVMTI_ERROR_INTERNAL; + } + return JVMTI_ERROR_NONE; +} + +jvmtiError +JvmtiExport::add_module_exports(Handle module, Handle pkg_name, Handle to_module, TRAPS) { + if (!Universe::is_module_initialized()) { + return JVMTI_ERROR_NONE; // extra safety + } + assert(!module.is_null(), "module should always be set"); + assert(!to_module.is_null(), "to_module should always be set"); + assert(!pkg_name.is_null(), "pkg_name should always be set"); + + // Invoke the addExports method + JavaValue result(T_VOID); + JavaCalls::call_static(&result, + SystemDictionary::module_Modules_klass(), + vmSymbols::addExports_name(), + vmSymbols::addExports_signature(), + module, + pkg_name, + to_module, + THREAD); + + if (HAS_PENDING_EXCEPTION) { + Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); + LogTarget(Trace, jvmti) log; + LogStreamCHeap log_stream(log); + java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream); + log_stream.cr(); + CLEAR_PENDING_EXCEPTION; + if (ex_name == vmSymbols::java_lang_IllegalArgumentException()) { + return JVMTI_ERROR_ILLEGAL_ARGUMENT; + } + return JVMTI_ERROR_INTERNAL; + } + return JVMTI_ERROR_NONE; +} + +jvmtiError +JvmtiExport::add_module_opens(Handle module, Handle pkg_name, Handle to_module, TRAPS) { + if (!Universe::is_module_initialized()) { + return JVMTI_ERROR_NONE; // extra safety + } + assert(!module.is_null(), "module should always be set"); + assert(!to_module.is_null(), "to_module should always be set"); + assert(!pkg_name.is_null(), "pkg_name should always be set"); + + // Invoke the addOpens method + JavaValue result(T_VOID); + JavaCalls::call_static(&result, + SystemDictionary::module_Modules_klass(), + vmSymbols::addOpens_name(), + vmSymbols::addExports_signature(), + module, + pkg_name, + to_module, + THREAD); + + if (HAS_PENDING_EXCEPTION) { + Symbol* ex_name = PENDING_EXCEPTION->klass()->name(); + LogTarget(Trace, jvmti) log; + LogStreamCHeap log_stream(log); + java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream); + log_stream.cr(); + CLEAR_PENDING_EXCEPTION; + if (ex_name == vmSymbols::java_lang_IllegalArgumentException()) { + return JVMTI_ERROR_ILLEGAL_ARGUMENT; + } + return JVMTI_ERROR_INTERNAL; + } + return JVMTI_ERROR_NONE; +} + +jvmtiError +JvmtiExport::add_module_uses(Handle module, Handle service, TRAPS) { + if (!Universe::is_module_initialized()) { + return JVMTI_ERROR_NONE; // extra safety + } + assert(!module.is_null(), "module should always be set"); + assert(!service.is_null(), "service should always be set"); + + // Invoke the addUses method + JavaValue result(T_VOID); + JavaCalls::call_static(&result, + SystemDictionary::module_Modules_klass(), + vmSymbols::addUses_name(), + vmSymbols::addUses_signature(), + module, + service, + THREAD); + + if (HAS_PENDING_EXCEPTION) { + LogTarget(Trace, jvmti) log; + LogStreamCHeap log_stream(log); + java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream); + log_stream.cr(); + CLEAR_PENDING_EXCEPTION; + return JVMTI_ERROR_INTERNAL; + } + return JVMTI_ERROR_NONE; +} + +jvmtiError +JvmtiExport::add_module_provides(Handle module, Handle service, Handle impl_class, TRAPS) { + if (!Universe::is_module_initialized()) { + return JVMTI_ERROR_NONE; // extra safety + } + assert(!module.is_null(), "module should always be set"); + assert(!service.is_null(), "service should always be set"); + assert(!impl_class.is_null(), "impl_class should always be set"); + + // Invoke the addProvides method + JavaValue result(T_VOID); + JavaCalls::call_static(&result, + SystemDictionary::module_Modules_klass(), + vmSymbols::addProvides_name(), + vmSymbols::addProvides_signature(), + module, + service, + impl_class, + THREAD); + + if (HAS_PENDING_EXCEPTION) { + LogTarget(Trace, jvmti) log; + LogStreamCHeap log_stream(log); + java_lang_Throwable::print(PENDING_EXCEPTION, &log_stream); + log_stream.cr(); + CLEAR_PENDING_EXCEPTION; + return JVMTI_ERROR_INTERNAL; + } + return JVMTI_ERROR_NONE; +} + void JvmtiExport::decode_version_values(jint version, int * major, int * minor, int * micro) {
--- a/hotspot/src/share/vm/prims/jvmtiExport.hpp Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/prims/jvmtiExport.hpp Wed Jul 05 22:32:06 2017 +0200 @@ -218,6 +218,21 @@ // Add read edges to the unnamed modules of the bootstrap and app class loaders static void add_default_read_edges(Handle h_module, TRAPS) NOT_JVMTI_RETURN; + // Add a read edge to the module + static jvmtiError add_module_reads(Handle module, Handle to_module, TRAPS); + + // Updates a module to export a package + static jvmtiError add_module_exports(Handle module, Handle pkg_name, Handle to_module, TRAPS); + + // Updates a module to open a package + static jvmtiError add_module_opens(Handle module, Handle pkg_name, Handle to_module, TRAPS); + + // Add a used service to the module + static jvmtiError add_module_uses(Handle module, Handle service, TRAPS); + + // Add a service provider to the module + static jvmtiError add_module_provides(Handle module, Handle service, Handle impl_class, TRAPS); + // let JVMTI know that the JVM_OnLoad code is running static void enter_onload_phase() NOT_JVMTI_RETURN;
--- a/hotspot/src/share/vm/prims/whitebox.cpp Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/prims/whitebox.cpp Wed Jul 05 22:32:06 2017 +0200 @@ -1415,14 +1415,6 @@ Modules::add_reads_module(from_module, source_module, CHECK); WB_END -WB_ENTRY(jboolean, WB_CanReadModule(JNIEnv* env, jobject o, jobject asking_module, jobject source_module)) - return Modules::can_read_module(asking_module, source_module, THREAD); -WB_END - -WB_ENTRY(jboolean, WB_IsExportedToModule(JNIEnv* env, jobject o, jobject from_module, jstring package, jobject to_module)) - return Modules::is_exported_to_module(from_module, package, to_module, THREAD); -WB_END - WB_ENTRY(void, WB_AddModulePackage(JNIEnv* env, jobject o, jclass module, jstring package)) Modules::add_module_package(module, package, CHECK); WB_END @@ -1866,10 +1858,6 @@ (void*)&WB_AddModuleExports }, {CC"AddReadsModule", CC"(Ljava/lang/Object;Ljava/lang/Object;)V", (void*)&WB_AddReadsModule }, - {CC"CanReadModule", CC"(Ljava/lang/Object;Ljava/lang/Object;)Z", - (void*)&WB_CanReadModule }, - {CC"IsExportedToModule", CC"(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)Z", - (void*)&WB_IsExportedToModule }, {CC"AddModulePackage", CC"(Ljava/lang/Object;Ljava/lang/String;)V", (void*)&WB_AddModulePackage }, {CC"GetModuleByPackageName", CC"(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;",
--- a/hotspot/src/share/vm/runtime/arguments.cpp Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/runtime/arguments.cpp Wed Jul 05 22:32:06 2017 +0200 @@ -170,6 +170,8 @@ #define ADDEXPORTS_LEN 10 #define ADDREADS "addreads" #define ADDREADS_LEN 8 +#define ADDOPENS "addopens" +#define ADDOPENS_LEN 8 #define PATCH "patch" #define PATCH_LEN 5 #define ADDMODS "addmods" @@ -196,6 +198,7 @@ const char* property_suffix = property + MODULE_PROPERTY_PREFIX_LEN; if (matches_property_suffix(property_suffix, ADDEXPORTS, ADDEXPORTS_LEN) || matches_property_suffix(property_suffix, ADDREADS, ADDREADS_LEN) || + matches_property_suffix(property_suffix, ADDOPENS, ADDOPENS_LEN) || matches_property_suffix(property_suffix, PATCH, PATCH_LEN) || matches_property_suffix(property_suffix, ADDMODS, ADDMODS_LEN) || matches_property_suffix(property_suffix, LIMITMODS, LIMITMODS_LEN) || @@ -2555,6 +2558,7 @@ unsigned int addreads_count = 0; unsigned int addexports_count = 0; +unsigned int addopens_count = 0; unsigned int addmods_count = 0; unsigned int patch_mod_count = 0; @@ -2809,6 +2813,10 @@ if (!create_numbered_property("jdk.module.addexports", tail, addexports_count++)) { return JNI_ENOMEM; } + } else if (match_option(option, "--add-opens=", &tail)) { + if (!create_numbered_property("jdk.module.addopens", tail, addopens_count++)) { + return JNI_ENOMEM; + } } else if (match_option(option, "--add-modules=", &tail)) { if (!create_numbered_property("jdk.module.addmods", tail, addmods_count++)) { return JNI_ENOMEM;
--- a/hotspot/src/share/vm/runtime/javaCalls.cpp Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/runtime/javaCalls.cpp Wed Jul 05 22:32:06 2017 +0200 @@ -285,6 +285,14 @@ } +void JavaCalls::call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, Handle arg3, TRAPS) { + JavaCallArguments args; // One oop argument + args.push_oop(arg1); + args.push_oop(arg2); + args.push_oop(arg3); + call_static(result, klass, name, signature, &args, CHECK); +} + // ------------------------------------------------- // Implementation of JavaCalls (low level)
--- a/hotspot/src/share/vm/runtime/javaCalls.hpp Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/src/share/vm/runtime/javaCalls.hpp Wed Jul 05 22:32:06 2017 +0200 @@ -210,6 +210,7 @@ static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, TRAPS); static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, TRAPS); static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, TRAPS); + static void call_static(JavaValue* result, KlassHandle klass, Symbol* name, Symbol* signature, Handle arg1, Handle arg2, Handle arg3, TRAPS); // Low-level interface static void call(JavaValue* result, const methodHandle& method, JavaCallArguments* args, TRAPS);
--- a/hotspot/test/TEST.ROOT Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/TEST.ROOT Wed Jul 05 22:32:06 2017 +0200 @@ -47,8 +47,8 @@ vm.gc.ConcMarkSweep \ vm.debug -# Tests using jtreg 4.2 b03 features -requiredVersion=4.2 b03 +# Tests using jtreg 4.2 b04 features +requiredVersion=4.2 b04 # Path to libraries in the topmost test directory. This is needed so @library # does not need ../../ notation to reach them
--- a/hotspot/test/compiler/c2/Test7190310_unsafe.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/c2/Test7190310_unsafe.java Wed Jul 05 22:32:06 2017 +0200 @@ -25,7 +25,8 @@ * @test * @bug 7190310 * @summary Inlining WeakReference.get(), and hoisting $referent may lead to non-terminating loops - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open + * @modules java.base/java.lang.ref:open * * @run main/othervm -Xbatch compiler.c2.Test7190310_unsafe */
--- a/hotspot/test/compiler/codegen/Test8011901.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/codegen/Test8011901.java Wed Jul 05 22:32:06 2017 +0200 @@ -25,7 +25,7 @@ * @test * @bug 8011901 * @summary instruct xaddL_no_res shouldn't allow 64 bit constants. - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * * @run main/othervm -XX:-BackgroundCompilation compiler.codegen.Test8011901 */
--- a/hotspot/test/compiler/escapeAnalysis/TestUnsafePutAddressNullObjMustNotEscape.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/escapeAnalysis/TestUnsafePutAddressNullObjMustNotEscape.java Wed Jul 05 22:32:06 2017 +0200 @@ -25,7 +25,7 @@ * @test * @bug 8038048 * @summary assert(null_obj->escape_state() == PointsToNode::NoEscape,etc) - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * * @run main/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:+DoEscapeAnalysis * -XX:-TieredCompilation -Xbatch
--- a/hotspot/test/compiler/intrinsics/bigInteger/MontgomeryMultiplyTest.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/intrinsics/bigInteger/MontgomeryMultiplyTest.java Wed Jul 05 22:32:06 2017 +0200 @@ -27,7 +27,8 @@ * @bug 8130150 8131779 8139907 * @summary Verify that the Montgomery multiply and square intrinsic works and correctly checks their arguments. * @requires vm.flavor == "server" - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:open + * @modules java.base/java.math:open * @library /test/lib * * @build sun.hotspot.WhiteBox
--- a/hotspot/test/compiler/intrinsics/unsafe/AllocateUninitializedArray.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/intrinsics/unsafe/AllocateUninitializedArray.java Wed Jul 05 22:32:06 2017 +0200 @@ -25,7 +25,7 @@ * @test * @bug 8150465 * @summary Unsafe methods to produce uninitialized arrays - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * * @run main/othervm -ea -Diters=200 -Xint * compiler.intrinsics.unsafe.AllocateUninitializedArray
--- a/hotspot/test/compiler/intrinsics/unsafe/TestUnsafeUnalignedMismatchedAccesses.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/intrinsics/unsafe/TestUnsafeUnalignedMismatchedAccesses.java Wed Jul 05 22:32:06 2017 +0200 @@ -25,7 +25,7 @@ * @test * @bug 8136473 * @summary Mismatched stores on same slice possible with Unsafe.Put*Unaligned methods - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * * @run main/othervm -XX:-UseOnStackReplacement -XX:-BackgroundCompilation * compiler.intrinsics.unsafe.TestUnsafeUnalignedMismatchedAccesses
--- a/hotspot/test/compiler/intrinsics/unsafe/UnsafeGetAddressTest.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/intrinsics/unsafe/UnsafeGetAddressTest.java Wed Jul 05 22:32:06 2017 +0200 @@ -25,7 +25,7 @@ * @test * @bug 6653795 * @summary C2 intrinsic for Unsafe.getAddress performs pointer sign extension on 32-bit systems - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * * @run main compiler.intrinsics.unsafe.UnsafeGetAddressTest */
--- a/hotspot/test/compiler/intrinsics/unsafe/UnsafeTwoCASLong.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/intrinsics/unsafe/UnsafeTwoCASLong.java Wed Jul 05 22:32:06 2017 +0200 @@ -25,7 +25,7 @@ * @test * @bug 8143930 * @summary C1 LinearScan asserts when compiling two back-to-back CompareAndSwapLongs - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * * @run testng/othervm -Diters=200000 -XX:TieredStopAtLevel=1 * compiler.intrinsics.unsafe.UnsafeTwoCASLong
--- a/hotspot/test/compiler/jsr292/RedefineMethodUsedByMultipleMethodHandles.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/jsr292/RedefineMethodUsedByMultipleMethodHandles.java Wed Jul 05 22:32:06 2017 +0200 @@ -30,6 +30,7 @@ * java.compiler * java.instrument * java.management + * jdk.attach * * @run main/othervm compiler.jsr292.RedefineMethodUsedByMultipleMethodHandles */ @@ -42,7 +43,6 @@ import jdk.internal.org.objectweb.asm.MethodVisitor; import jdk.internal.org.objectweb.asm.Opcodes; -import javax.tools.ToolProvider; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -132,7 +132,7 @@ int p = vmName.indexOf('@'); assert p != -1 : "VM name not in <pid>@<host> format: " + vmName; String pid = vmName.substring(0, p); - ClassLoader cl = ToolProvider.getSystemToolClassLoader(); + ClassLoader cl = ClassLoader.getSystemClassLoader(); Class<?> c = Class.forName("com.sun.tools.attach.VirtualMachine", true, cl); Method attach = c.getDeclaredMethod("attach", String.class); Method loadAgent = c.getDeclaredMethod("loadAgent", String.class);
--- a/hotspot/test/compiler/jvmci/compilerToVM/GetResolvedJavaMethodTest.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/jvmci/compilerToVM/GetResolvedJavaMethodTest.java Wed Jul 05 22:32:06 2017 +0200 @@ -27,8 +27,8 @@ * @requires (vm.simpleArch == "x64" | vm.simpleArch == "sparcv9" | vm.simpleArch == "aarch64") * @library / /test/lib * @library ../common/patches - * @modules java.base/jdk.internal.misc - * @modules jdk.vm.ci/jdk.vm.ci.hotspot + * @modules java.base/jdk.internal.misc:+open + * @modules jdk.vm.ci/jdk.vm.ci.hotspot:+open * * @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper * jdk.vm.ci/jdk.vm.ci.hotspot.PublicMetaspaceWrapperObject
--- a/hotspot/test/compiler/jvmci/compilerToVM/GetSymbolTest.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/jvmci/compilerToVM/GetSymbolTest.java Wed Jul 05 22:32:06 2017 +0200 @@ -27,10 +27,10 @@ * @requires (vm.simpleArch == "x64" | vm.simpleArch == "sparcv9" | vm.simpleArch == "aarch64") * @library / /test/lib * @library ../common/patches - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * @modules java.base/jdk.internal.org.objectweb.asm * java.base/jdk.internal.org.objectweb.asm.tree - * jdk.vm.ci/jdk.vm.ci.hotspot + * @modules jdk.vm.ci/jdk.vm.ci.hotspot:+open * jdk.vm.ci/jdk.vm.ci.code * jdk.vm.ci/jdk.vm.ci.meta * @build jdk.vm.ci/jdk.vm.ci.hotspot.CompilerToVMHelper
--- a/hotspot/test/compiler/jvmci/compilerToVM/JVM_RegisterJVMCINatives.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/jvmci/compilerToVM/JVM_RegisterJVMCINatives.java Wed Jul 05 22:32:06 2017 +0200 @@ -26,8 +26,8 @@ * @bug 8136421 * @requires (vm.simpleArch == "x64" | vm.simpleArch == "sparcv9" | vm.simpleArch == "aarch64") * @library /test/lib / - * @modules java.base/jdk.internal.misc - * @modules jdk.vm.ci/jdk.vm.ci.hotspot + * @modules java.base/jdk.internal.misc:open + * @modules jdk.vm.ci/jdk.vm.ci.hotspot:open * jdk.vm.ci/jdk.vm.ci.runtime * @run main/othervm -XX:+UnlockExperimentalVMOptions * -Dcompiler.jvmci.compilerToVM.JVM_RegisterJVMCINatives.positive=true
--- a/hotspot/test/compiler/jvmci/jdk.vm.ci.hotspot.test/src/jdk/vm/ci/hotspot/test/MethodHandleAccessProviderTest.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.hotspot.test/src/jdk/vm/ci/hotspot/test/MethodHandleAccessProviderTest.java Wed Jul 05 22:32:06 2017 +0200 @@ -27,9 +27,10 @@ * @bug 8161068 * @requires (vm.simpleArch == "x64" | vm.simpleArch == "sparcv9" | vm.simpleArch == "aarch64") * @library /test/lib /compiler/jvmci/jdk.vm.ci.hotspot.test/src + * @modules java.base/java.lang.invoke:+open * @modules jdk.vm.ci/jdk.vm.ci.meta * jdk.vm.ci/jdk.vm.ci.runtime - * jdk.vm.ci/jdk.vm.ci.hotspot + * @modules jdk.vm.ci/jdk.vm.ci.hotspot:+open * @run testng/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI * jdk.vm.ci.hotspot.test.MethodHandleAccessProviderTest */
--- a/hotspot/test/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/RedefineClassTest.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/jvmci/jdk.vm.ci.runtime.test/src/jdk/vm/ci/runtime/test/RedefineClassTest.java Wed Jul 05 22:32:06 2017 +0200 @@ -27,6 +27,7 @@ * @library ../../../../../ * @modules jdk.vm.ci/jdk.vm.ci.meta * jdk.vm.ci/jdk.vm.ci.runtime + * jdk.attach * java.base/jdk.internal.misc * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI jdk.vm.ci.runtime.test.RedefineClassTest */ @@ -37,7 +38,6 @@ import org.junit.Assert; import org.junit.Test; -import javax.tools.ToolProvider; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -137,7 +137,7 @@ int p = vmName.indexOf('@'); assumeTrue(p != -1); String pid = vmName.substring(0, p); - ClassLoader cl = ToolProvider.getSystemToolClassLoader(); + ClassLoader cl = ClassLoader.getSystemClassLoader(); Class<?> c = Class.forName("com.sun.tools.attach.VirtualMachine", true, cl); Method attach = c.getDeclaredMethod("attach", String.class); Method loadAgent = c.getDeclaredMethod("loadAgent", String.class, String.class);
--- a/hotspot/test/compiler/rangechecks/TestExplicitRangeChecks.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/rangechecks/TestExplicitRangeChecks.java Wed Jul 05 22:32:06 2017 +0200 @@ -26,7 +26,7 @@ * @bug 8073480 * @summary explicit range checks should be recognized by C2 * @library /test/lib / - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * @build sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox * @run main/othervm -ea -Xmixed -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
--- a/hotspot/test/compiler/runtime/Test8010927.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/runtime/Test8010927.java Wed Jul 05 22:32:06 2017 +0200 @@ -26,7 +26,7 @@ * @bug 8010927 * @summary Kitchensink crashed with SIGSEGV, Problematic frame: v ~StubRoutines::checkcast_arraycopy * @library /test/lib - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * @build sun.hotspot.WhiteBox * @run driver ClassFileInstaller sun.hotspot.WhiteBox * sun.hotspot.WhiteBox$WhiteBoxPermission
--- a/hotspot/test/compiler/unsafe/GetUnsafeObjectG1PreBarrier.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/unsafe/GetUnsafeObjectG1PreBarrier.java Wed Jul 05 22:32:06 2017 +0200 @@ -26,7 +26,7 @@ * @bug 8016474 * @summary The bug only happens with C1 and G1 using a different ObjectAlignmentInBytes than KlassAlignmentInBytes (which is 8) * - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * @run main/othervm -Xbatch -XX:+IgnoreUnrecognizedVMOptions -XX:ObjectAlignmentInBytes=32 * compiler.unsafe.GetUnsafeObjectG1PreBarrier */
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestBoolean.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestBoolean.java Wed Jul 05 22:32:06 2017 +0200 @@ -26,7 +26,7 @@ * @bug 8143628 * @summary Test unsafe access for boolean * - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestBoolean * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestBoolean * @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestBoolean
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestByte.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestByte.java Wed Jul 05 22:32:06 2017 +0200 @@ -26,7 +26,7 @@ * @bug 8143628 * @summary Test unsafe access for byte * - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestByte * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestByte * @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestByte
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestChar.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestChar.java Wed Jul 05 22:32:06 2017 +0200 @@ -26,7 +26,7 @@ * @bug 8143628 * @summary Test unsafe access for char * - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestChar * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestChar * @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestChar
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestDouble.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestDouble.java Wed Jul 05 22:32:06 2017 +0200 @@ -26,7 +26,7 @@ * @bug 8143628 * @summary Test unsafe access for double * - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestDouble * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestDouble * @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestDouble
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestFloat.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestFloat.java Wed Jul 05 22:32:06 2017 +0200 @@ -26,7 +26,7 @@ * @bug 8143628 * @summary Test unsafe access for float * - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestFloat * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestFloat * @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestFloat
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestInt.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestInt.java Wed Jul 05 22:32:06 2017 +0200 @@ -26,7 +26,7 @@ * @bug 8143628 * @summary Test unsafe access for int * - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestInt * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestInt * @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestInt
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestLong.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestLong.java Wed Jul 05 22:32:06 2017 +0200 @@ -26,7 +26,7 @@ * @bug 8143628 * @summary Test unsafe access for long * - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestLong * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestLong * @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestLong
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestObject.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestObject.java Wed Jul 05 22:32:06 2017 +0200 @@ -26,7 +26,7 @@ * @bug 8143628 * @summary Test unsafe access for Object * - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestObject * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestObject * @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestObject
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestShort.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeAccessTestShort.java Wed Jul 05 22:32:06 2017 +0200 @@ -26,7 +26,7 @@ * @bug 8143628 * @summary Test unsafe access for short * - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * @run testng/othervm -Diters=100 -Xint compiler.unsafe.JdkInternalMiscUnsafeAccessTestShort * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 compiler.unsafe.JdkInternalMiscUnsafeAccessTestShort * @run testng/othervm -Diters=20000 -XX:-TieredCompilation compiler.unsafe.JdkInternalMiscUnsafeAccessTestShort
--- a/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeUnalignedAccess.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/unsafe/JdkInternalMiscUnsafeUnalignedAccess.java Wed Jul 05 22:32:06 2017 +0200 @@ -25,7 +25,7 @@ * @test * @bug 8158260 * @summary Test unaligned Unsafe accesses - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * * @run main/othervm -Diters=20000 -XX:-UseOnStackReplacement -XX:-BackgroundCompilation * compiler.unsafe.JdkInternalMiscUnsafeUnalignedAccess
--- a/hotspot/test/compiler/unsafe/TestUnsafeLoadControl.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/compiler/unsafe/TestUnsafeLoadControl.java Wed Jul 05 22:32:06 2017 +0200 @@ -25,7 +25,7 @@ * @test * @bug 8077504 * @summary Unsafe load can loose control dependency and cause crash - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:+open * * @run main/othervm -XX:-BackgroundCompilation -XX:-UseOnStackReplacement * compiler.unsafe.TestUnsafeLoadControl
--- a/hotspot/test/gc/g1/TestStringDeduplicationAgeThreshold.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/gc/g1/TestStringDeduplicationAgeThreshold.java Wed Jul 05 22:32:06 2017 +0200 @@ -28,7 +28,8 @@ * @key gc * @requires vm.gc.G1 * @library /test/lib - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:open + * @modules java.base/java.lang:open * java.management */
--- a/hotspot/test/gc/g1/TestStringDeduplicationFullGC.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/gc/g1/TestStringDeduplicationFullGC.java Wed Jul 05 22:32:06 2017 +0200 @@ -28,7 +28,8 @@ * @key gc * @requires vm.gc.G1 * @library /test/lib - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:open + * @modules java.base/java.lang:open * java.management */
--- a/hotspot/test/gc/g1/TestStringDeduplicationInterned.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/gc/g1/TestStringDeduplicationInterned.java Wed Jul 05 22:32:06 2017 +0200 @@ -28,7 +28,8 @@ * @key gc * @requires vm.gc.G1 * @library /test/lib - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:open + * @modules java.base/java.lang:open * java.management */
--- a/hotspot/test/gc/g1/TestStringDeduplicationPrintOptions.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/gc/g1/TestStringDeduplicationPrintOptions.java Wed Jul 05 22:32:06 2017 +0200 @@ -28,7 +28,8 @@ * @key gc * @requires vm.gc.G1 * @library /test/lib - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:open + * @modules java.base/java.lang:open * java.management */
--- a/hotspot/test/gc/g1/TestStringDeduplicationTableRehash.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/gc/g1/TestStringDeduplicationTableRehash.java Wed Jul 05 22:32:06 2017 +0200 @@ -28,7 +28,8 @@ * @key gc * @requires vm.gc.G1 * @library /test/lib - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:open + * @modules java.base/java.lang:open * java.management */
--- a/hotspot/test/gc/g1/TestStringDeduplicationTableResize.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/gc/g1/TestStringDeduplicationTableResize.java Wed Jul 05 22:32:06 2017 +0200 @@ -28,7 +28,8 @@ * @key gc * @requires vm.gc.G1 * @library /test/lib - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:open + * @modules java.base/java.lang:open * java.management */
--- a/hotspot/test/gc/g1/TestStringDeduplicationTools.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/gc/g1/TestStringDeduplicationTools.java Wed Jul 05 22:32:06 2017 +0200 @@ -190,6 +190,7 @@ "-Xmx" + Xmx + "m", "-XX:+UseG1GC", "-XX:+UnlockDiagnosticVMOptions", + "--add-opens=java.base/java.lang=ALL-UNNAMED", "-XX:+VerifyAfterGC" // Always verify after GC };
--- a/hotspot/test/gc/g1/TestStringDeduplicationYoungGC.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/gc/g1/TestStringDeduplicationYoungGC.java Wed Jul 05 22:32:06 2017 +0200 @@ -28,7 +28,8 @@ * @key gc * @requires vm.gc.G1 * @library /test/lib - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:open + * @modules java.base/java.lang:open * java.management */
--- a/hotspot/test/gc/stress/gcbasher/TestGCBasher.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/gc/stress/gcbasher/TestGCBasher.java Wed Jul 05 22:32:06 2017 +0200 @@ -38,7 +38,8 @@ FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/")); Stream<Path> s = Files.walk(fs.getPath("/")); for (Path p : (Iterable<Path>)s::iterator) { - if (p.toString().endsWith(".class")) { + if (p.toString().endsWith(".class") && + !p.getFileName().toString().equals("module-info.class")) { byte[] data = Files.readAllBytes(p); Decompiler d = new Decompiler(data); ClassInfo ci = d.getClassInfo();
--- a/hotspot/test/runtime/LocalLong/LocalLongTest.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/LocalLong/LocalLongTest.java Wed Jul 05 22:32:06 2017 +0200 @@ -39,6 +39,10 @@ public static void main(String... args) throws Exception { if (Platform.is64bit()) { ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xint", + "--add-opens", + "java.base/java.lang=ALL-UNNAMED", + "--add-opens", + "java.base/java.lang.invoke=ALL-UNNAMED", "LocalLongHelper"); OutputAnalyzer o = new OutputAnalyzer(pb.start()); o.shouldHaveExitValue(0);
--- a/hotspot/test/runtime/Throwable/StackTraceLogging.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/Throwable/StackTraceLogging.java Wed Jul 05 22:32:06 2017 +0200 @@ -52,6 +52,8 @@ public static void main(String[] args) throws Exception { ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xlog:stacktrace=info", "-XX:MaxJavaStackTraceDepth=1024", + "--add-opens", + "java.base/java.lang=ALL-UNNAMED", "TestThrowable"); analyzeOutputOn(pb); }
--- a/hotspot/test/runtime/Throwable/TestThrowable.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/Throwable/TestThrowable.java Wed Jul 05 22:32:06 2017 +0200 @@ -25,7 +25,8 @@ * @test * @bug 8150778 * @summary Test exception depths, and code to get stack traces - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:open + * @modules java.base/java.lang:open * @library /test/lib * @run main/othervm -XX:MaxJavaStackTraceDepth=1024 TestThrowable */
--- a/hotspot/test/runtime/Throwable/ThrowableIntrospectionSegfault.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/Throwable/ThrowableIntrospectionSegfault.java Wed Jul 05 22:32:06 2017 +0200 @@ -25,7 +25,8 @@ * @test * @bug 8033735 * @summary check backtrace field introspection - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:open + * @modules java.base/java.lang:open * @run main ThrowableIntrospectionSegfault */
--- a/hotspot/test/runtime/getSysPackage/GetSysPkgTest.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/getSysPackage/GetSysPkgTest.java Wed Jul 05 22:32:06 2017 +0200 @@ -100,7 +100,7 @@ ClassFileInstaller.writeClassToDisk("GetSysPkg_package/GetSysClass", klassbuf); ProcessBuilder pb = ProcessTools.createJavaProcessBuilder("-Xbootclasspath/a:bl_dir", - "--add-exports=java.base/jdk.internal.loader=ALL-UNNAMED", "-cp", "." + File.pathSeparator + + "--add-opens=java.base/jdk.internal.loader=ALL-UNNAMED", "-cp", "." + File.pathSeparator + System.getProperty("test.classes"), "GetSysPkgTest", "do_tests"); OutputAnalyzer output = new OutputAnalyzer(pb.start()); output.shouldHaveExitValue(0);
--- a/hotspot/test/runtime/modules/AccessCheck/CheckRead.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/CheckRead.java Wed Jul 05 22:32:06 2017 +0200 @@ -69,7 +69,7 @@ // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m3") .exports("p1") @@ -80,9 +80,9 @@ // Packages: p2 // Packages exported: p2 is exported to m1 ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .exports("p2", "m1") + .exports("p2", Set.of("m1")) .build(); // Define module: m3 @@ -90,10 +90,10 @@ // Packages: p3 // Packages exported: none ModuleDescriptor descriptor_m3 = - new ModuleDescriptor.Builder("m3") + ModuleDescriptor.module("m3") .requires("java.base") .requires("m2") - .conceals("p3") + .contains("p3") .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_CheckRead.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_CheckRead.java Wed Jul 05 22:32:06 2017 +0200 @@ -69,7 +69,7 @@ // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m3") .exports("p1") @@ -80,9 +80,9 @@ // Packages: p2 // Packages exported: p2 is exported to m1 ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .exports("p2", "m1") + .exports("p2", Set.of("m1")) .build(); // Define module: m3 @@ -90,10 +90,10 @@ // Packages: p3 // Packages exported: none ModuleDescriptor descriptor_m3 = - new ModuleDescriptor.Builder("m3") + ModuleDescriptor.module("m3") .requires("java.base") .requires("m2") - .conceals("p3") + .contains("p3") .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpQualOther.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpQualOther.java Wed Jul 05 22:32:06 2017 +0200 @@ -70,7 +70,7 @@ // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .requires("m3") @@ -82,9 +82,9 @@ // Packages: p2 // Packages exported: p2 is exported to m3 ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .exports("p2", "m3") + .exports("p2", Set.of("m3")) .build(); // Define module: m3 @@ -92,10 +92,10 @@ // Packages: p3 // Packages exported: none ModuleDescriptor descriptor_m3 = - new ModuleDescriptor.Builder("m3") + ModuleDescriptor.module("m3") .requires("java.base") .requires("m2") - .conceals("p3") + .contains("p3") .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpQualToM1.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpQualToM1.java Wed Jul 05 22:32:06 2017 +0200 @@ -68,7 +68,7 @@ // Packages: p1 // Packages exported: p1 is exported to unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .exports("p1") @@ -79,9 +79,9 @@ // Packages: p2 // Packages exported: package p2 is exported to m1 ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .exports("p2", "m1") + .exports("p2", Set.of("m1")) .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpUnqual.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_ExpUnqual.java Wed Jul 05 22:32:06 2017 +0200 @@ -69,7 +69,7 @@ // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .exports("p1") @@ -80,7 +80,7 @@ // Packages: p2 // Packages exported: package p2 is exported to m1 ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") .exports("p2") .build();
--- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_PkgNotExp.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_PkgNotExp.java Wed Jul 05 22:32:06 2017 +0200 @@ -68,7 +68,7 @@ // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .exports("p1") @@ -79,9 +79,9 @@ // Packages: p2 // Packages exported: none ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .conceals("p2") + .contains("p2") .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_Umod.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_Umod.java Wed Jul 05 22:32:06 2017 +0200 @@ -80,7 +80,7 @@ // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .exports("p1") .build(); @@ -129,7 +129,7 @@ // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .exports("p1") .build(); @@ -178,7 +178,7 @@ // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .exports("p1") .build();
--- a/hotspot/test/runtime/modules/AccessCheck/DiffCL_UmodUpkg.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/DiffCL_UmodUpkg.java Wed Jul 05 22:32:06 2017 +0200 @@ -75,7 +75,7 @@ // Packages: p3 // Packages exported: p3 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .exports("p3") .build(); @@ -124,7 +124,7 @@ // Packages: p3 // Packages exported: p3 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .exports("p3") .build();
--- a/hotspot/test/runtime/modules/AccessCheck/ExpQualOther.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/ExpQualOther.java Wed Jul 05 22:32:06 2017 +0200 @@ -70,7 +70,7 @@ // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .requires("m3") @@ -82,9 +82,9 @@ // Packages: p2 // Packages exported: p2 is exported to m3 ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .exports("p2", "m3") + .exports("p2", Set.of("m3")) .build(); // Define module: m3 @@ -92,10 +92,10 @@ // Packages: p3 // Packages exported: none ModuleDescriptor descriptor_m3 = - new ModuleDescriptor.Builder("m3") + ModuleDescriptor.module("m3") .requires("java.base") .requires("m2") - .conceals("p3") + .contains("p3") .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/ExpQualToM1.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/ExpQualToM1.java Wed Jul 05 22:32:06 2017 +0200 @@ -58,7 +58,7 @@ // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .exports("p1") @@ -69,9 +69,9 @@ // Packages: p2 // Packages exported: p2 is exported qualifiedly to m1 ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .exports("p2", "m1") + .exports("p2", Set.of("m1")) .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/ExpUnqual.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/ExpUnqual.java Wed Jul 05 22:32:06 2017 +0200 @@ -58,7 +58,7 @@ // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .exports("p1") @@ -69,7 +69,7 @@ // Packages: p2 // Packages exported: p2 is exported unqualifiedly ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") .exports("p2") .build();
--- a/hotspot/test/runtime/modules/AccessCheck/ExportAllUnnamed.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/ExportAllUnnamed.java Wed Jul 05 22:32:06 2017 +0200 @@ -71,7 +71,7 @@ // Packages: none // Packages exported: none ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .build(); @@ -81,9 +81,9 @@ // Packages: p2 // Packages exported: p2 is exported unqualifiedly ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .exports("p2", "m1") + .exports("p2", Set.of("m1")) .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/PkgNotExp.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/PkgNotExp.java Wed Jul 05 22:32:06 2017 +0200 @@ -68,7 +68,7 @@ // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .exports("p1") @@ -79,9 +79,9 @@ // Packages: p2 // Packages exported: none ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .conceals("p2") + .contains("p2") .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/Umod.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/Umod.java Wed Jul 05 22:32:06 2017 +0200 @@ -80,7 +80,7 @@ // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .exports("p1") .build(); @@ -126,7 +126,7 @@ // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .exports("p1") .build(); @@ -172,7 +172,7 @@ // Packages: p1 // Packages exported: p1 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .exports("p1") .build();
--- a/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_ExpQualOther.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_ExpQualOther.java Wed Jul 05 22:32:06 2017 +0200 @@ -70,7 +70,7 @@ // Packages: none // Packages exported: none ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .build(); @@ -80,9 +80,9 @@ // Packages: p2 // Packages exported: none ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .exports("p2", "m1") + .exports("p2", Set.of("m1")) .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_ExpUnqual.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_ExpUnqual.java Wed Jul 05 22:32:06 2017 +0200 @@ -70,7 +70,7 @@ // Packages: none // Packages exported: none ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .build(); @@ -80,7 +80,7 @@ // Packages: p2 // Packages exported: none ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") .exports("p2") .build();
--- a/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_PkgNotExp.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodDiffCL_PkgNotExp.java Wed Jul 05 22:32:06 2017 +0200 @@ -69,7 +69,7 @@ // Packages: none // Packages exported: none ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .build(); @@ -79,9 +79,9 @@ // Packages: p2 // Packages exported: none ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .conceals("p2") + .contains("p2") .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/UmodUPkg.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodUPkg.java Wed Jul 05 22:32:06 2017 +0200 @@ -75,7 +75,7 @@ // Packages: p3 // Packages exported: p3 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .exports("p3") .build(); @@ -121,7 +121,7 @@ // Packages: p3 // Packages exported: p3 is exported unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .exports("p3") .build();
--- a/hotspot/test/runtime/modules/AccessCheck/UmodUpkgDiffCL_ExpQualOther.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodUpkgDiffCL_ExpQualOther.java Wed Jul 05 22:32:06 2017 +0200 @@ -70,7 +70,7 @@ // Packages: none // Packages exported: none ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .build(); @@ -80,9 +80,9 @@ // Packages: p6 // Packages exported: p6 exported to m1 ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .exports("p6", "m1") + .exports("p6", Set.of("m1")) .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/UmodUpkgDiffCL_NotExp.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodUpkgDiffCL_NotExp.java Wed Jul 05 22:32:06 2017 +0200 @@ -69,7 +69,7 @@ // Packages: none // Packages exported: none ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .build(); @@ -79,9 +79,9 @@ // Packages: p6 // Packages exported: none ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .conceals("p6") + .contains("p6") .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/UmodUpkg_ExpQualOther.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodUpkg_ExpQualOther.java Wed Jul 05 22:32:06 2017 +0200 @@ -69,7 +69,7 @@ // Packages: none // Packages exported: none ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .requires("m3") @@ -80,9 +80,9 @@ // Packages: p6 // Packages exported: p6 is exported to m3 ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .exports("p6", "m3") + .exports("p6", Set.of("m3")) .build(); // Define module: m3 @@ -90,7 +90,7 @@ // Packages: p3 // Packages exported: none ModuleDescriptor descriptor_m3 = - new ModuleDescriptor.Builder("m3") + ModuleDescriptor.module("m3") .requires("java.base") .build();
--- a/hotspot/test/runtime/modules/AccessCheck/UmodUpkg_NotExp.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/UmodUpkg_NotExp.java Wed Jul 05 22:32:06 2017 +0200 @@ -67,7 +67,7 @@ // Packages: none // Packages exported: none ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .build(); @@ -77,9 +77,9 @@ // Packages: p6 // Packages exported: none ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .conceals("p6") + .contains("p6") .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/AccessCheck/Umod_ExpQualOther.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/Umod_ExpQualOther.java Wed Jul 05 22:32:06 2017 +0200 @@ -69,7 +69,7 @@ // Packages: none // Packages exported: none ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .requires("m3") @@ -80,9 +80,9 @@ // Packages: p2 // Packages exported: p2 is exported to m3 ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .exports("p2", "m3") + .exports("p2", Set.of("m3")) .build(); // Define module: m3 @@ -90,7 +90,7 @@ // Packages: p3 // Packages exported: none ModuleDescriptor descriptor_m3 = - new ModuleDescriptor.Builder("m3") + ModuleDescriptor.module("m3") .requires("java.base") .build();
--- a/hotspot/test/runtime/modules/AccessCheck/Umod_ExpUnqual.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/Umod_ExpUnqual.java Wed Jul 05 22:32:06 2017 +0200 @@ -69,7 +69,7 @@ // Packages: none // Packages exported: none ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .build(); @@ -79,7 +79,7 @@ // Packages: p2 // Packages exported: p2 is exported unqualifiedly ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") .exports("p2") .build();
--- a/hotspot/test/runtime/modules/AccessCheck/Umod_PkgNotExp.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/AccessCheck/Umod_PkgNotExp.java Wed Jul 05 22:32:06 2017 +0200 @@ -67,7 +67,7 @@ // Packages: none // Packages exported: none ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .build(); @@ -77,9 +77,9 @@ // Packages: p2 // Packages exported: none ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .conceals("p2") + .contains("p2") .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/IgnoreModulePropertiesTest.java Wed Jul 05 22:32:06 2017 +0200 @@ -72,6 +72,6 @@ testOption("--add-reads", "xyzz=yyzd", "jdk.module.addreads.0", "WARNING: Unknown module: xyzz"); testOption("--add-exports", "java.base/xyzz=yyzd", "jdk.module.addexports.0", "WARNING: package xyzz not in java.base"); - testOption("--patch-module", "=d", "jdk.module.patch.0", "IllegalArgumentException"); + testOption("--patch-module", "=d", "jdk.module.patch.0", "Missing module name"); } }
--- a/hotspot/test/runtime/modules/JVMAddModulePackage.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/JVMAddModulePackage.java Wed Jul 05 22:32:06 2017 +0200 @@ -33,6 +33,7 @@ */ import static jdk.test.lib.Asserts.*; +import java.sql.Time; public class JVMAddModulePackage { @@ -123,6 +124,29 @@ // Expected } + // Add package named "java" to an module defined to a class loader other than the boot or platform loader. + try { + // module1 is defined to a MyClassLoader class loader. + ModuleHelper.AddModulePackage(module1, "java/foo"); + throw new RuntimeException("Failed to get the expected IAE"); + } catch(IllegalArgumentException e) { + if (!e.getMessage().contains("prohibited package name")) { + throw new RuntimeException("Failed to get expected IAE message for prohibited package name: " + e.getMessage()); + } + } + + // Package "javabar" should be ok + ModuleHelper.AddModulePackage(module1, "javabar"); + + // Package named "java" defined to the boot class loader, should be ok + Object module_javabase = module1.getClass().getModule(); + ModuleHelper.AddModulePackage(module_javabase, "java/foo"); + + // Package named "java" defined to the platform class loader, should be ok + // The module java.sql is defined to the platform class loader. + java.sql.Time jst = new java.sql.Time(45000); // milliseconds + Object module_javasql = jst.getClass().getModule(); + ModuleHelper.AddModulePackage(module_javasql, "java/foo"); } static class MyClassLoader extends ClassLoader { }
--- a/hotspot/test/runtime/modules/JVMCanReadModule.java Fri Dec 02 10:52:51 2016 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2016, 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 - * @modules java.base/jdk.internal.misc - * @library /test/lib .. - * @build sun.hotspot.WhiteBox - * @compile/module=java.base java/lang/reflect/ModuleHelper.java - * @run main ClassFileInstaller sun.hotspot.WhiteBox - * sun.hotspot.WhiteBox$WhiteBoxPermission - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI JVMCanReadModule - */ - -import static jdk.test.lib.Asserts.*; - -public class JVMCanReadModule { - - public static void main(String args[]) throws Throwable { - MyClassLoader asking_cl = new MyClassLoader(); - MyClassLoader target_cl = new MyClassLoader(); - Object asking_module, target_module; - boolean result; - - asking_module = ModuleHelper.ModuleObject("asking_module", asking_cl, new String[] { "mypackage" }); - assertNotNull(asking_module, "Module should not be null"); - ModuleHelper.DefineModule(asking_module, "9.0", "asking_module/here", new String[] { "mypackage" }); - target_module = ModuleHelper.ModuleObject("target_module", target_cl, new String[] { "yourpackage" }); - assertNotNull(target_module, "Module should not be null"); - ModuleHelper.DefineModule(target_module, "9.0", "target_module/here", new String[] { "yourpackage" }); - - // Set up relationship - ModuleHelper.AddReadsModule(asking_module, target_module); - - // Null asking_module argument, expect an NPE - try { - result = ModuleHelper.CanReadModule(null, target_module); - throw new RuntimeException("Failed to get the expected NPE"); - } catch(NullPointerException e) { - // Expected - } - - // Bad asking_module argument, expect an IAE - try { - result = ModuleHelper.CanReadModule(asking_cl, target_module); - throw new RuntimeException("Failed to get the expected IAE"); - } catch(IllegalArgumentException e) { - // Expected - } - - // Bad target_module argument, expect an IAE - try { - result = ModuleHelper.CanReadModule(asking_module, asking_cl); - throw new RuntimeException("Failed to get the expected IAE"); - } catch(IllegalArgumentException e) { - // Expected - } - - // Verify strict modules can not read the unnamed module - result = ModuleHelper.CanReadModule(target_module, null); - assertFalse(result, "target_module can not read unnamed module"); - - // Verify asking_module can read itself - result = ModuleHelper.CanReadModule(asking_module, asking_module); - assertTrue(result, "asking_module can read itself"); - - // Verify asking_module can read target_module - result = ModuleHelper.CanReadModule(asking_module, target_module); - assertTrue(result, "asking_module can read target_module"); - - // Verify target_module cannot read asking_module - result = ModuleHelper.CanReadModule(target_module, asking_module); - assertTrue(!result, "target_module cannot read asking_module"); - } - - static class MyClassLoader extends ClassLoader { } -}
--- a/hotspot/test/runtime/modules/JVMDefineModule.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/JVMDefineModule.java Wed Jul 05 22:32:06 2017 +0200 @@ -33,6 +33,7 @@ */ import static jdk.test.lib.Asserts.*; +import java.sql.Time; public class JVMDefineModule { @@ -238,6 +239,39 @@ } } + // Package named "java" defined to a class loader other than the boot or platform class loader, expect an IAE + m = ModuleHelper.ModuleObject("modulejavapkg1", cl, new String[] { "java/foo" }); + try { + // module m is defined to an instance of MyClassLoader class loader + ModuleHelper.DefineModule(m, "9.0", "modulejavapkg1", new String[] { "java/foo" }); + throw new RuntimeException("Failed to get expected IAE for package java/foo"); + } catch(IllegalArgumentException e) { + if (!e.getMessage().contains("prohibited package name")) { + throw new RuntimeException("Failed to get expected IAE message for prohibited package name: " + e.getMessage()); + } + } + + // Package named "javabar" defined to a class loader other than the boot or platform class loader, should be ok + m = ModuleHelper.ModuleObject("modulejavapkg2", cl, new String[] { "javabar" }); + assertNotNull(m, "Module should not be null"); + ModuleHelper.DefineModule(m, "9.0", "modulejavapkg2", new String[] { "javabar" }); + + // Package named "java" defined to the boot class loader, should be ok + // m's type is a java.lang.Object, module is java.base + // java.base module is defined to the boot loader + ClassLoader boot_loader = m.getClass().getClassLoader(); + m = ModuleHelper.ModuleObject("modulejavapkg3", boot_loader, new String[] { "java/foo" }); + assertNotNull(m, "Module should not be null"); + ModuleHelper.DefineModule(m, "9.0", "modulejavapkg3", new String[] { "java/foo" }); + + // Package named "java" defined to the platform class loader, should be ok + // java.sql module defined to the platform class loader. + java.sql.Time jst = new java.sql.Time(45 * 1000); + ClassLoader platform_loader = jst.getClass().getClassLoader(); + m = ModuleHelper.ModuleObject("modulejavapkg4", platform_loader, new String[] { "java/foo" }); + assertNotNull(m, "Module should not be null"); + ModuleHelper.DefineModule(m, "9.0", "modulejavapkg4", new String[] { "java/foo" }); + // module version that is null, should be okay m = ModuleHelper.ModuleObject("module8", cl, new String[] { "a_package_8" }); assertNotNull(m, "Module should not be null");
--- a/hotspot/test/runtime/modules/JVMIsExportedToModule.java Fri Dec 02 10:52:51 2016 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,124 +0,0 @@ -/* - * Copyright (c) 2016, 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 - * @modules java.base/jdk.internal.misc - * @library /test/lib .. - * @build sun.hotspot.WhiteBox - * @compile/module=java.base java/lang/reflect/ModuleHelper.java - * @run main ClassFileInstaller sun.hotspot.WhiteBox - * sun.hotspot.WhiteBox$WhiteBoxPermission - * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI JVMIsExportedToModule - */ - -import static jdk.test.lib.Asserts.*; - -public class JVMIsExportedToModule { - - public static void main(String args[]) throws Throwable { - MyClassLoader from_cl = new MyClassLoader(); - MyClassLoader to_cl = new MyClassLoader(); - Object from_module, to_module; - boolean result; - - from_module = ModuleHelper.ModuleObject("from_module", from_cl, new String[] { "mypackage", "this/package" }); - assertNotNull(from_module, "Module from_module should not be null"); - ModuleHelper.DefineModule(from_module, "9.0", "from_module/here", new String[] { "mypackage", "this/package" }); - to_module = ModuleHelper.ModuleObject("to_module", to_cl, new String[] { "yourpackage", "that/package" }); - assertNotNull(to_module, "Module to_module should not be null"); - ModuleHelper.DefineModule(to_module, "9.0", "to_module/here", new String[] { "yourpackage", "that/package" }); - - Object unnamed_module = JVMIsExportedToModule.class.getModule(); - assertNotNull(unnamed_module, "Module unnamed_module should not be null"); - - // Null from_module argument, expect an NPE - try { - result = ModuleHelper.IsExportedToModule(null, "mypackage", to_module); - throw new RuntimeException("Failed to get the expected NPE for null from_module"); - } catch(NullPointerException e) { - // Expected - } - - // Null to_module argument, expect an NPE - try { - result = ModuleHelper.IsExportedToModule(from_module, "mypackage", null); - throw new RuntimeException("Failed to get expected NPE for null to_module"); - } catch(NullPointerException e) { - // Expected - } - - // Null package argument, expect an NPE - try { - result = ModuleHelper.IsExportedToModule(from_module, null, to_module); - throw new RuntimeException("Failed to get the expected NPE for null package"); - } catch(NullPointerException e) { - // Expected - } - - // Bad from_module argument, expect an IAE - try { - result = ModuleHelper.IsExportedToModule(to_cl, "mypackage", to_module); - throw new RuntimeException("Failed to get the expected IAE for bad from_module"); - } catch(IllegalArgumentException e) { - // Expected - } - - // Bad to_module argument, expect an IAE - try { - result = ModuleHelper.IsExportedToModule(from_module, "mypackage", from_cl); - throw new RuntimeException("Failed to get the expected IAE"); - } catch(IllegalArgumentException e) { - // Expected - } - - // Check that package is exported to its own module - result = ModuleHelper.IsExportedToModule(from_module, "mypackage", from_module); - assertTrue(result, "Package is always exported to itself"); - - // Package is not in to_module, expect an IAE - try { - result = ModuleHelper.IsExportedToModule(from_module, "yourpackage", from_cl); - throw new RuntimeException("Failed to get the expected IAE for package not in to_module"); - } catch(IllegalArgumentException e) { - // Expected - } - - // Package is accessible when exported to unnamed module - ModuleHelper.AddModuleExportsToAll(from_module, "mypackage"); - result = ModuleHelper.IsExportedToModule(from_module, "mypackage", to_module); - assertTrue(result, "Package exported to unnamed module is visible to named module"); - - result = ModuleHelper.IsExportedToModule(from_module, "mypackage", unnamed_module); - assertTrue(result, "Package exported to unnamed module is visible to unnamed module"); - - // Package is accessible only to named module when exported to named module - ModuleHelper.AddModuleExports(from_module, "this/package", to_module); - result = ModuleHelper.IsExportedToModule(from_module, "this/package", to_module); - assertTrue(result, "Package exported to named module is visible to named module"); - result = ModuleHelper.IsExportedToModule(from_module, "this/package", unnamed_module); - assertTrue(!result, "Package exported to named module is not visible to unnamed module"); - } - - static class MyClassLoader extends ClassLoader { } -}
--- a/hotspot/test/runtime/modules/ModuleHelper.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/ModuleHelper.java Wed Jul 05 22:32:06 2017 +0200 @@ -73,17 +73,6 @@ java.lang.reflect.ModuleHelper.addExportsNoSync((Module)m, pkg, (Module)null); } - public static boolean CanReadModule(Object from, Object to) throws Throwable { - WhiteBox wb = WhiteBox.getWhiteBox(); - return wb.CanReadModule(from, to); - } - - public static boolean IsExportedToModule(Object from, String pkg, - Object to) throws Throwable { - WhiteBox wb = WhiteBox.getWhiteBox(); - return wb.IsExportedToModule(from, pkg, to); - } - public static Module ModuleObject(String name, ClassLoader loader, String[] pkgs) throws Throwable { Set<String> pkg_set = new HashSet<>(); if (pkgs != null) { @@ -95,7 +84,7 @@ } ModuleDescriptor descriptor = - new ModuleDescriptor.Builder(name).conceals(pkg_set).build(); + ModuleDescriptor.module(name).contains(pkg_set).build(); URI uri = URI.create("module:/" + name); return java.lang.reflect.ModuleHelper.newModule(loader, descriptor);
--- a/hotspot/test/runtime/modules/ModuleStress/ModuleNonBuiltinCLMain.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/ModuleStress/ModuleNonBuiltinCLMain.java Wed Jul 05 22:32:06 2017 +0200 @@ -57,7 +57,7 @@ // Packages: p1 // Packages exported: p1 is exported to unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .exports("p1") @@ -71,7 +71,7 @@ targets.add("m1"); targets.add("m3"); ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") .requires("m3") .exports("p2", targets) @@ -82,7 +82,7 @@ // Packages: p3 // Packages exported: none ModuleDescriptor descriptor_m3 = - new ModuleDescriptor.Builder("m3") + ModuleDescriptor.module("m3") .requires("java.base") .build();
--- a/hotspot/test/runtime/modules/ModuleStress/ModuleSameCLMain.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/ModuleStress/ModuleSameCLMain.java Wed Jul 05 22:32:06 2017 +0200 @@ -55,7 +55,7 @@ // Packages: p1 // Packages exported: p1 is exported to unqualifiedly ModuleDescriptor descriptor_m1 = - new ModuleDescriptor.Builder("m1") + ModuleDescriptor.module("m1") .requires("java.base") .requires("m2") .exports("p1") @@ -66,9 +66,9 @@ // Packages: p2 // Packages exported: package p2 is exported to m1 ModuleDescriptor descriptor_m2 = - new ModuleDescriptor.Builder("m2") + ModuleDescriptor.module("m2") .requires("java.base") - .exports("p2", "m1") + .exports("p2", Set.of("m1")) .build(); // Set up a ModuleFinder containing all modules for this layer.
--- a/hotspot/test/runtime/modules/getModuleJNI/GetModule.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/getModuleJNI/GetModule.java Wed Jul 05 22:32:06 2017 +0200 @@ -35,10 +35,6 @@ } static native Object callGetModule(java.lang.Class clazz); - static native void callAddModuleReads(java.lang.reflect.Module from_module, - java.lang.reflect.Module source_module); - static native boolean callCanReadModule(java.lang.reflect.Module asking_module, - java.lang.reflect.Module source_module); public static void main(String[] args) { Module module; @@ -144,71 +140,6 @@ } catch(NullPointerException e) { // Expected } - - - // Tests for JNI_AddModuleReads() // - - Module javaScriptingModule = javax.script.Bindings.class.getModule(); - if (javaScriptingModule == null) { - throw new RuntimeException("Failed to get java.scripting module"); - } - Module javaLoggingModule = java.util.logging.Level.class.getModule(); - if (javaLoggingModule == null) { - throw new RuntimeException("Failed to get java.logging module"); - } - - if (callCanReadModule(javaLoggingModule, javaScriptingModule)) { - throw new RuntimeException( - "Expected FALSE because javaLoggingModule cannot read javaScriptingModule"); - } - - callAddModuleReads(javaLoggingModule, javaScriptingModule); - callAddModuleReads(javaScriptingModule, GetModule.class.getModule()); // unnamed module - - try { - callAddModuleReads(null, javaLoggingModule); - throw new RuntimeException( - "Expected NullPointerException for bad from_module not thrown"); - } catch(NullPointerException e) { - // expected - } - - try { - callAddModuleReads(javaLoggingModule, null); - throw new RuntimeException( - "Expected NullPointerException for bad source_module not thrown"); - } catch(NullPointerException e) { - // expected - } - - - // Tests for JNI_CanReadModule() // - - if (!callCanReadModule(javaLoggingModule, javaScriptingModule)) { - throw new RuntimeException( - "Expected TRUE because javaLoggingModule can read javaScriptingModule"); - } - - if (callCanReadModule(javaBaseModule, javaScriptingModule)) { - throw new RuntimeException( - "Expected FALSE because javaBaseModule cannnot read javaScriptingModule"); - } - - try { - callCanReadModule(javaLoggingModule, null); - throw new RuntimeException( - "Expected NullPointerException for bad sourceModule not thrown"); - } catch(NullPointerException e) { - // expected - } - - try { - callCanReadModule(null, javaScriptingModule); - throw new RuntimeException( - "Expected NullPointerException for bad asking_module not thrown"); - } catch(NullPointerException e) { - // expected - } } static class MyClassLoader extends ClassLoader { }
--- a/hotspot/test/runtime/modules/getModuleJNI/libGetModule.c Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/runtime/modules/getModuleJNI/libGetModule.c Wed Jul 05 22:32:06 2017 +0200 @@ -28,15 +28,3 @@ jobject res = (jobject)((*env)->GetModule(env, clazz)); return res; } - -JNIEXPORT void JNICALL -Java_GetModule_callAddModuleReads(JNIEnv *env, jclass unused, jobject from_module, jobject source_module) { - (*env)->AddModuleReads(env, from_module, source_module); -} - -JNIEXPORT jboolean JNICALL -Java_GetModule_callCanReadModule(JNIEnv *env, jclass unused, jobject asking_module, jobject source_module) { - jboolean res = (*env)->CanReadModule(env, asking_module, source_module); - return res; -} -
--- a/hotspot/test/serviceability/attach/AttachWithStalePidFile.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/serviceability/attach/AttachWithStalePidFile.java Wed Jul 05 22:32:06 2017 +0200 @@ -26,7 +26,8 @@ * @bug 7162400 * @key regression * @summary Regression test for attach issue where stale pid files in /tmp lead to connection issues - * @modules java.base/jdk.internal.misc + * @modules java.base/jdk.internal.misc:open + * @modules java.base/java.lang:open * @modules jdk.attach/sun.tools.attach * @library /test/lib * @run main AttachWithStalePidFile
--- a/hotspot/test/serviceability/jdwp/AllModulesCommandTest.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/serviceability/jdwp/AllModulesCommandTest.java Wed Jul 05 22:32:06 2017 +0200 @@ -32,7 +32,7 @@ * @test * @summary Tests the modules-related JDWP commands * @library /test/lib - * @ignore 8168478 + * @ignore 8170541 * @modules jdk.jdwp.agent * @modules java.base/jdk.internal.misc * @compile AllModulesCommandTestDebuggee.java @@ -96,8 +96,7 @@ if (modName != null) { // JDWP reports unnamed modules, ignore them jdwpModuleNames.add(modName); } - // Assert the JDWP CANREAD and CLASSLOADER commands - assertCanRead(modId, modName); + // Assert the CLASSLOADER commands assertClassLoader(modId, modName); } @@ -134,13 +133,6 @@ } } - private void assertCanRead(long modId, String modName) throws IOException { - // Simple assert for the CANREAD command - JdwpCanReadReply reply = new JdwpCanReadCmd(modId, modId).send(channel); - assertReply(reply); - assertTrue(reply.canRead(), "canRead() reports false for reading from the same module '" + modName + "', moduleId=" + modId); - } - private void assertClassLoader(long modId, String modName) throws IOException { // Verify that the module classloader id is valid JdwpClassLoaderReply reply = new JdwpClassLoaderCmd(modId).send(channel);
--- a/hotspot/test/serviceability/jdwp/JdwpCanReadCmd.java Fri Dec 02 10:52:51 2016 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2016, 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. - */ - -/** - * The JDWP CANREAD command - */ -public class JdwpCanReadCmd extends JdwpCmd<JdwpCanReadReply> { - - public JdwpCanReadCmd(long modId, long srcModId) { - super(3, 18, JdwpCanReadReply.class, 2 * refLen()); - putRefId(modId); - putRefId(srcModId); - } - -}
--- a/hotspot/test/serviceability/jdwp/JdwpCanReadReply.java Fri Dec 02 10:52:51 2016 -0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -/* - * Copyright (c) 2016, 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.DataInputStream; -import java.io.IOException; - -/** - * The reply to the JDWP CANREAD command - */ -public class JdwpCanReadReply extends JdwpReply { - - private boolean canRead; - - protected void parseData(DataInputStream ds) throws IOException { - canRead = (ds.read() != 0); - } - - public boolean canRead() { - return canRead; - } - -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/MyPackage/AddModuleExportsAndOpensTest.java Wed Jul 05 22:32:06 2017 +0200 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package MyPackage; + +/** + * @test + * @summary Verifies the JVMTI AddModuleExports and AddModuleOpens API + * @compile AddModuleExportsAndOpensTest.java + * @run main/othervm/native -agentlib:AddModuleExportsAndOpensTest MyPackage.AddModuleExportsAndOpensTest + */ + +import java.io.PrintStream; +import java.lang.reflect.Module; + +public class AddModuleExportsAndOpensTest { + + static { + try { + System.loadLibrary("AddModuleExportsAndOpensTest"); + } catch (UnsatisfiedLinkError ule) { + System.err.println("Could not load AddModuleExportsAndOpensTest library"); + System.err.println("java.library.path: " + + System.getProperty("java.library.path")); + throw ule; + } + } + + native static int check(Module baseModule, Module thisModule); + + public static void main(String args[]) { + Module baseModule = Object.class.getModule(); + Module thisModule = AddModuleExportsAndOpensTest.class.getClassLoader().getUnnamedModule(); + int status = check(baseModule, thisModule); + if (status != 0) { + throw new RuntimeException("Non-zero status returned from the agent: " + status); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/jvmti/AddModuleExportsAndOpens/libAddModuleExportsAndOpensTest.c Wed Jul 05 22:32:06 2017 +0200 @@ -0,0 +1,298 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include <stdio.h> +#include <string.h> +#include "jvmti.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef JNI_ENV_ARG + +#ifdef __cplusplus +#define JNI_ENV_ARG(x, y) y +#define JNI_ENV_PTR(x) x +#else +#define JNI_ENV_ARG(x,y) x, y +#define JNI_ENV_PTR(x) (*x) +#endif + +#endif + +#define TranslateError(err) "JVMTI error" + +#define PASSED 0 +#define FAILED 2 + +static const char *EXC_CNAME = "java/lang/Exception"; +static const char* MOD_CNAME = "Ljava/lang/reflect/Module;"; + +static jvmtiEnv *jvmti = NULL; +static jint result = PASSED; + +static jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved); + +JNIEXPORT +jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) { + return Agent_Initialize(jvm, options, reserved); +} + +JNIEXPORT +jint JNICALL Agent_OnAttach(JavaVM *jvm, char *options, void *reserved) { + return Agent_Initialize(jvm, options, reserved); +} + +JNIEXPORT +jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) { + return JNI_VERSION_1_8; +} + +static +jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) { + jint res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &jvmti), + JVMTI_VERSION_9); + if (res != JNI_OK || jvmti == NULL) { + printf(" Error: wrong result of a valid call to GetEnv!\n"); + return JNI_ERR; + } + + return JNI_OK; +} + +static +jint throw_exc(JNIEnv *env, char *msg) { + jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME)); + + if (exc_class == NULL) { + printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME); + return -1; + } + return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg); +} + +static +jclass jlrM(JNIEnv *env) { + jclass cls = NULL; + + cls = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, MOD_CNAME)); + if (cls == NULL) { + printf(" Error in JNI FindClass: %s\n", MOD_CNAME); + } + return cls; +} + +jmethodID +get_method(JNIEnv *env, jclass clazz, const char * name, const char *sig) { + jmethodID method = NULL; + + method = JNI_ENV_PTR(env)->GetMethodID(JNI_ENV_ARG(env, clazz), name, sig); + if (method == NULL) { + printf(" Error in JNI GetMethodID %s with signature %s", name, sig); + } + return method; +} + +static +jboolean is_exported(JNIEnv *env, jobject module, const char* pkg, jboolean open) { + static jmethodID mIsExported = NULL; + jstring jstr = NULL; + jboolean res = JNI_FALSE; + + if (mIsExported == NULL) { + const char* sign = "(Ljava/lang/String;)Z"; + const char* name = open ? "isOpen" : "isExported"; + mIsExported = get_method(env, jlrM(env), name, sign); + } + jstr = JNI_ENV_PTR(env)->NewStringUTF(JNI_ENV_ARG(env, pkg)); + res = JNI_ENV_PTR(env)->CallBooleanMethod(JNI_ENV_ARG(env, module), + mIsExported, jstr); + return res; +} + +static +jboolean is_exported_to(JNIEnv *env, jobject module, const char* pkg, jobject to_module, + jboolean open) { + static jmethodID mIsExportedTo = NULL; + jstring jstr = NULL; + jboolean res = JNI_FALSE; + + if (mIsExportedTo == NULL) { + const char* sign = "(Ljava/lang/String;Ljava/lang/reflect/Module;)Z"; + const char* name = open ? "isOpen" : "isExported"; + mIsExportedTo = get_method(env, jlrM(env), name, sign); + } + jstr = JNI_ENV_PTR(env)->NewStringUTF(JNI_ENV_ARG(env, pkg)); + res = JNI_ENV_PTR(env)->CallBooleanMethod(JNI_ENV_ARG(env, module), + mIsExportedTo, jstr, to_module); + return res; +} + +static +jvmtiError add_module_exports(jobject baseModule, const char* pkg, jobject thisModule, + jboolean open) { + jvmtiError err = JVMTI_ERROR_NONE; + if (open) { + err = (*jvmti)->AddModuleOpens(jvmti, baseModule, pkg, thisModule); + } else { + err = (*jvmti)->AddModuleExports(jvmti, baseModule, pkg, thisModule); + } + return err; +} + +static +jint check_add_module_exports(JNIEnv *env, + jclass cls, + jobject baseModule, + jobject thisModule, + jboolean open) { + static char strbuf[128] = { '\0' }; + jvmtiError err = JVMTI_ERROR_NONE; + const char* pkg = open ? "jdk.internal.math" + : "jdk.internal.misc"; + const char* bad_pkg = "my.bad.pkg"; + const char* jvmti_fn = open ? "AddModuleOpens" + : "AddModuleExports"; + jboolean exported = JNI_FALSE; + + // Export from NULL module + printf("Check #N1:\n"); + err = add_module_exports(NULL, pkg, thisModule, open); + if (err != JVMTI_ERROR_NULL_POINTER) { + printf("#N1: jvmtiError from %s: %d\n", jvmti_fn, err); + throw_exc(env, "Check #N1: failed to return JVMTI_ERROR_NULL_POINTER for module==NULL"); + return FAILED; + } + + // Export NULL package + printf("Check #N2:\n"); + err = add_module_exports(baseModule, NULL, thisModule, open); + if (err != JVMTI_ERROR_NULL_POINTER) { + printf("#N2: jvmtiError from %s: %d\n", jvmti_fn, err); + throw_exc(env, "Check #N2: failed to return JVMTI_ERROR_NULL_POINTER for pkg==NULL"); + return FAILED; + } + + // Export to NULL module + printf("Check #N3:\n"); + err = add_module_exports(baseModule, pkg, NULL, open); + if (err != JVMTI_ERROR_NULL_POINTER) { + printf("#N3: jvmtiError from %s: %d\n", jvmti_fn, err); + throw_exc(env, "Check #N3: failed to return JVMTI_ERROR_NULL_POINTER for to_module==NULL"); + return FAILED; + } + + // Export a bad package + printf("Check #I0:\n"); + err = add_module_exports(baseModule, bad_pkg, thisModule, open); + if (err != JVMTI_ERROR_ILLEGAL_ARGUMENT) { + printf("#I0: jvmtiError from %s: %d\n", jvmti_fn, err); + throw_exc(env, "Check #I0: did not get expected JVMTI_ERROR_ILLEGAL_ARGUMENT for invalid package"); + return FAILED; + } + + // Export from invalid module (cls) + printf("Check #I1:\n"); + err = add_module_exports((jobject)cls, pkg, thisModule, open); + if (err != JVMTI_ERROR_INVALID_MODULE) { + printf("#I1: jvmtiError from %s: %d\n", jvmti_fn, err); + throw_exc(env, "Check #I1: did not get expected JVMTI_ERROR_INVALID_MODULE for invalid module"); + return FAILED; + } + + // Export to invalid module (cls) + printf("Check #I2:\n"); + err = add_module_exports(baseModule, pkg, (jobject)cls, open); + if (err != JVMTI_ERROR_INVALID_MODULE) { + printf("#I2: jvmtiError from %s: %d\n", jvmti_fn, err); + throw_exc(env, "Check #I2: did not get expected JVMTI_ERROR_INVALID_MODULE for invalid to_module"); + return FAILED; + } + + // Check the pkg is not exported from baseModule to thisModule + printf("Check #C0:\n"); + exported = is_exported_to(env, baseModule, pkg, thisModule, open); + if (exported != JNI_FALSE) { + sprintf(strbuf, "Check #C0: unexpected export of %s from base to this", pkg); + throw_exc(env, strbuf); + return FAILED; + } + + // Add export of the pkg from baseModule to thisModule + printf("Check #C1:\n"); + err = add_module_exports(baseModule, pkg, thisModule, open); + if (err != JVMTI_ERROR_NONE) { + printf("#C1: jvmtiError from %s: %d\n", jvmti_fn, err); + sprintf(strbuf, "Check #C1: error in add export of %s from base to this", pkg); + throw_exc(env, strbuf); + return FAILED; + } + + // Check the pkg is exported from baseModule to thisModule + printf("Check #C2:\n"); + exported = is_exported_to(env, baseModule, pkg, thisModule, open); + if (exported == JNI_FALSE) { + sprintf(strbuf, "Check #C2: failed to export %s from base to this", pkg); + throw_exc(env, strbuf); + return FAILED; + } + + // Check the pkg is not exported to all modules + printf("Check #C3:\n"); + exported = is_exported(env, baseModule, pkg, open); + if (exported != JNI_FALSE) { + sprintf(strbuf, "Check #C3: unexpected export of %s from base to all modules", pkg); + throw_exc(env, strbuf); + return FAILED; + } + return PASSED; +} + +JNIEXPORT jint JNICALL +Java_MyPackage_AddModuleExportsAndOpensTest_check(JNIEnv *env, + jclass cls, + jobject baseModule, + jobject thisModule) { + if (jvmti == NULL) { + throw_exc(env, "JVMTI client was not properly loaded!\n"); + return FAILED; + } + + printf("\n*** Checks for JVMTI AddModuleExports ***\n\n"); + result = check_add_module_exports(env, cls, baseModule, thisModule, JNI_FALSE); + if (result != PASSED) { + return result; + } + + printf("\n*** Checks for JVMTI AddModuleOpens ***\n\n"); + result = check_add_module_exports(env, cls, baseModule, thisModule, JNI_TRUE); + if (result != PASSED) { + return result; + } + return result; +} + +#ifdef __cplusplus +} +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/jvmti/AddModuleReads/MyPackage/AddModuleReadsTest.java Wed Jul 05 22:32:06 2017 +0200 @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package MyPackage; + +/** + * @test + * @summary Verifies the JVMTI AddModuleReads API + * @compile AddModuleReadsTest.java + * @run main/othervm/native -agentlib:AddModuleReadsTest MyPackage.AddModuleReadsTest + */ + +import java.io.PrintStream; +import java.lang.instrument.Instrumentation; +import java.lang.reflect.Module; + +public class AddModuleReadsTest { + + static { + try { + System.loadLibrary("AddModuleReadsTest"); + } catch (UnsatisfiedLinkError ule) { + System.err.println("Could not load AddModuleReadsTest library"); + System.err.println("java.library.path: " + + System.getProperty("java.library.path")); + throw ule; + } + } + + native static int check(Module unnamed, Module base, Module instrument); + + public static void main(String args[]) { + Module unnamed = AddModuleReadsTest.class.getClassLoader().getUnnamedModule(); + Module base = Object.class.getModule(); + Module instrument = Instrumentation.class.getModule(); + int status = check(unnamed, base, instrument); + if (status != 0) { + throw new RuntimeException("Non-zero status returned from the agent: " + status); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/jvmti/AddModuleReads/libAddModuleReadsTest.c Wed Jul 05 22:32:06 2017 +0200 @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include <stdio.h> +#include <string.h> +#include "jvmti.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef JNI_ENV_ARG + +#ifdef __cplusplus +#define JNI_ENV_ARG(x, y) y +#define JNI_ENV_PTR(x) x +#else +#define JNI_ENV_ARG(x,y) x, y +#define JNI_ENV_PTR(x) (*x) +#endif + +#endif + +#define TranslateError(err) "JVMTI error" + +#define PASSED 0 +#define FAILED 2 + +static const char *EXC_CNAME = "java/lang/Exception"; +static const char* MOD_CNAME = "Ljava/lang/reflect/Module;"; + +static jvmtiEnv *jvmti = NULL; +static jint result = PASSED; + +static jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved); + +JNIEXPORT +jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) { + return Agent_Initialize(jvm, options, reserved); +} + +JNIEXPORT +jint JNICALL Agent_OnAttach(JavaVM *jvm, char *options, void *reserved) { + return Agent_Initialize(jvm, options, reserved); +} + +JNIEXPORT +jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) { + return JNI_VERSION_1_8; +} + +static +jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) { + jint res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &jvmti), + JVMTI_VERSION_9); + if (res != JNI_OK || jvmti == NULL) { + printf(" Error: wrong result of a valid call to GetEnv!\n"); + return JNI_ERR; + } + return JNI_OK; +} + +static +jint throw_exc(JNIEnv *env, char *msg) { + jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME)); + + if (exc_class == NULL) { + printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME); + return -1; + } + return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg); +} + +static +jclass jlrM(JNIEnv *env) { + jclass cls = NULL; + + cls = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, MOD_CNAME)); + if (cls == NULL) { + printf(" Error in JNI FindClass: %s\n", MOD_CNAME); + } + return cls; +} + +jmethodID +get_method(JNIEnv *env, jclass clazz, const char * name, const char *sig) { + jmethodID method = NULL; + + method = JNI_ENV_PTR(env)->GetMethodID(JNI_ENV_ARG(env, clazz), name, sig); + if (method == NULL) { + printf(" Error in JNI GetMethodID %s with signature %s", name, sig); + } + return method; +} + +static +jboolean can_module_read(JNIEnv *env, jobject module, jobject to_module) { + static jmethodID mCanRead = NULL; + jboolean res = JNI_FALSE; + + if (mCanRead == NULL) { + const char* sign = "(Ljava/lang/reflect/Module;)Z"; + mCanRead = get_method(env, jlrM(env), "canRead", sign); + } + res = JNI_ENV_PTR(env)->CallBooleanMethod(JNI_ENV_ARG(env, module), + mCanRead, to_module); + return res; +} + +static +jint check_add_module_reads(JNIEnv *env, + jclass cls, + jobject unnamedModule, + jobject baseModule, + jobject instrModule) { + jvmtiError err = JVMTI_ERROR_NONE; + jboolean can = JNI_FALSE; + + // Add an invalid read edge from NULL module + printf("Check #N1:\n"); + err = (*jvmti)->AddModuleReads(jvmti, NULL, baseModule); + if (err != JVMTI_ERROR_NULL_POINTER) { + printf("#N1: jvmtiError from AddModuleReads: %d\n", err); + throw_exc(env, "Check #N1: failed to return JVMTI_ERROR_NULL_POINTER for module==NULL"); + return FAILED; + } + + // Add an invalid read edge to NULL module + printf("Check #N2:\n"); + err = (*jvmti)->AddModuleReads(jvmti, baseModule, NULL); + if (err != JVMTI_ERROR_NULL_POINTER) { + printf("#N2: jvmtiError from AddModuleReads: %d\n", err); + throw_exc(env, "Check #N2: failed to return JVMTI_ERROR_NULL_POINTER for to_module==NULL"); + return FAILED; + } + + // Add an invalid read edge from invalid module (cls) + printf("Check #I1:\n"); + err = (*jvmti)->AddModuleReads(jvmti, cls, baseModule); + if (err != JVMTI_ERROR_INVALID_MODULE) { + printf("#I1: jvmtiError from AddModuleReads: %d\n", err); + throw_exc(env, "Check #I1: failed to return JVMTI_ERROR_INVALID_MODULE for module==cls"); + return FAILED; + } + + // Add an invalid read edge to invalid module (cls) + printf("Check #I2:\n"); + err = (*jvmti)->AddModuleReads(jvmti, baseModule, cls); + if (err != JVMTI_ERROR_INVALID_MODULE) { + printf("#I2: jvmtiError from AddModuleReads: %d\n", err); + throw_exc(env, "Check #I2: failed to return JVMTI_ERROR_INVALID_MODULE for to_module==cls"); + return FAILED; + } + + // Check the edge baseModule->instrModule is absent + printf("Check #C0:\n"); + can = can_module_read(env, baseModule, instrModule); + if (can != JNI_FALSE) { + throw_exc(env, "Check #C0: read edge from base to instr is unexpected"); + return FAILED; + } + + // Add read edge baseModule->instrModule + printf("Check #C1:\n"); + err = (*jvmti)->AddModuleReads(jvmti, baseModule, instrModule); + if (err != JVMTI_ERROR_NONE) { + printf("#C1: jvmtiError from AddModuleReads: %d\n", err); + throw_exc(env, "Check #C1: error in add reads from base to instr"); + return FAILED; + } + + // Check the read edge baseModule->instrModule is present now + printf("Check #C2:\n"); + can = can_module_read(env, baseModule, instrModule); + if (can == JNI_FALSE) { + throw_exc(env, "Check #C2: failed to add reads from base to instr"); + return FAILED; + } + + // Check the read edge baseModule->unnamedModule is absent + printf("Check #C3:\n"); + can = can_module_read(env, baseModule, unnamedModule); + if (can != JNI_FALSE) { + throw_exc(env, "Check #C3: got unexpected read edge from base to unnamed"); + return FAILED; + } + + // Add read edge baseModule->unnamedModule + printf("Check #C4:\n"); + err = (*jvmti)->AddModuleReads(jvmti, baseModule, unnamedModule); + if (err != JVMTI_ERROR_NONE) { + printf("#C4: jvmtiError from AddModuleReads: %d\n", err); + throw_exc(env, "Check #C4: failed to ignore adding read edge from base to unnamed"); + return FAILED; + } + + // Check the read edge baseModule->unnamedModule is present now + printf("Check #C5:\n"); + can = can_module_read(env, baseModule, unnamedModule); + if (can == JNI_FALSE) { + throw_exc(env, "Check #C5: did not get expected read edge from base to unnamed"); + return FAILED; + } + + // Check the read edge unnamedModule->instrModule is absent + printf("Check #C6:\n"); + can = can_module_read(env, unnamedModule, instrModule); + if (can == JNI_FALSE) { + throw_exc(env, "Check #C6: did not get expected read edge from unnamed to instr"); + return FAILED; + } + + // Add read edge unnamedModule->instrModule + printf("Check #C7:\n"); + err = (*jvmti)->AddModuleReads(jvmti, unnamedModule, instrModule); + if (err != JVMTI_ERROR_NONE) { + printf("#C7: jvmtiError from AddModuleReads: %d\n", err); + throw_exc(env, "Check #C7: failed to ignore adding read edge from unnamed to instr"); + return FAILED; + } + return PASSED; +} + +JNIEXPORT jint JNICALL +Java_MyPackage_AddModuleReadsTest_check(JNIEnv *env, + jclass cls, + jobject unnamedModule, + jobject baseModule, + jobject instrModule) { + if (jvmti == NULL) { + throw_exc(env, "JVMTI client was not properly loaded!\n"); + return FAILED; + } + + printf("\n*** Checks for JVMTI AddModuleReads ***\n\n"); + result = check_add_module_reads(env, cls, unnamedModule, baseModule, instrModule); + if (result != PASSED) { + return result; + } + return result; +} + +#ifdef __cplusplus +} +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/MyPackage/AddModuleUsesAndProvidesTest.java Wed Jul 05 22:32:06 2017 +0200 @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package MyPackage; + +/** + * @test + * @summary Basic test for JVMTI AddModuleUses and AddModuleProvides + * @build java.base/java.lang.TestProvider + * java.base/jdk.internal.test.TestProviderImpl + * @compile AddModuleUsesAndProvidesTest.java + * @run main/othervm/native -agentlib:AddModuleUsesAndProvidesTest MyPackage.AddModuleUsesAndProvidesTest + */ + +import java.io.PrintStream; +import java.lang.TestProvider; +import java.lang.reflect.Module; + +public class AddModuleUsesAndProvidesTest { + + static { + try { + System.loadLibrary("AddModuleUsesAndProvidesTest"); + } catch (UnsatisfiedLinkError ule) { + System.err.println("Could not load AddModuleUsesAndProvidesTest library"); + System.err.println("java.library.path: " + + System.getProperty("java.library.path")); + throw ule; + } + } + + native static int checkUses(Module baseModule, Class<?> service); + native static int checkProvides(Module baseModule, Class<?> service, Class<?> serviceImpl); + + public static void main(String args[]) throws Exception { + Module baseModule = Object.class.getModule(); + Class<?> service = TestProvider.class; + Class<?> serviceImpl = Class.forName("jdk.internal.test.TestProviderImpl"); + + System.out.println("\n*** Checks for JVMTI AddModuleUses ***\n"); + + int status = checkUses(baseModule, service); + if (status != 0) { + throw new RuntimeException("Non-zero status returned from the agent: " + status); + } + + System.out.println("\n*** Checks for JVMTI AddModuleProvides ***\n"); + + System.out.println("Check #PC1:"); + if (TestProvider.providers().iterator().hasNext()) { + throw new RuntimeException("Check #PC1: Unexpectedly service is provided"); + } + + status = checkProvides(baseModule, service, serviceImpl); + if (status != 0) { + throw new RuntimeException("Non-zero status returned from the agent: " + status); + } + + System.out.println("Check #PC3:"); + if (!TestProvider.providers().iterator().hasNext()) { + throw new RuntimeException("Check #PC3: Unexpectedly service is not provided"); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/MyPackage/java.base/java/lang/TestProvider.java Wed Jul 05 22:32:06 2017 +0200 @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.lang; + +import java.util.ServiceLoader; + +public interface TestProvider { + public static Iterable<TestProvider> providers() { + return ServiceLoader.load(TestProvider.class); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/MyPackage/java.base/jdk/internal/test/TestProviderImpl.java Wed Jul 05 22:32:06 2017 +0200 @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.internal.test; + +import java.lang.TestProvider; + +public class TestProviderImpl implements TestProvider { + public TestProviderImpl() { } +} +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/serviceability/jvmti/AddModuleUsesAndProvides/libAddModuleUsesAndProvidesTest.c Wed Jul 05 22:32:06 2017 +0200 @@ -0,0 +1,280 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +#include <stdio.h> +#include <string.h> +#include "jvmti.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef JNI_ENV_ARG + +#ifdef __cplusplus +#define JNI_ENV_ARG(x, y) y +#define JNI_ENV_PTR(x) x +#else +#define JNI_ENV_ARG(x,y) x, y +#define JNI_ENV_PTR(x) (*x) +#endif + +#endif + +#define TranslateError(err) "JVMTI error" + +#define PASSED 0 +#define FAILED 2 + +static const char *EXC_CNAME = "java/lang/Exception"; +static const char* MOD_CNAME = "Ljava/lang/reflect/Module;"; + +static jvmtiEnv *jvmti = NULL; +static jint result = PASSED; + +static jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved); + +JNIEXPORT +jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved) { + return Agent_Initialize(jvm, options, reserved); +} + +JNIEXPORT +jint JNICALL Agent_OnAttach(JavaVM *jvm, char *options, void *reserved) { + return Agent_Initialize(jvm, options, reserved); +} + +JNIEXPORT +jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) { + return JNI_VERSION_1_8; +} + +static +jint Agent_Initialize(JavaVM *jvm, char *options, void *reserved) { + jint res = JNI_ENV_PTR(jvm)->GetEnv(JNI_ENV_ARG(jvm, (void **) &jvmti), + JVMTI_VERSION_9); + if (res != JNI_OK || jvmti == NULL) { + printf(" Error: wrong result of a valid call to GetEnv!\n"); + return JNI_ERR; + } + + return JNI_OK; +} + +static +jint throw_exc(JNIEnv *env, char *msg) { + jclass exc_class = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, EXC_CNAME)); + + if (exc_class == NULL) { + printf("throw_exc: Error in FindClass(env, %s)\n", EXC_CNAME); + return -1; + } + return JNI_ENV_PTR(env)->ThrowNew(JNI_ENV_ARG(env, exc_class), msg); +} + +static +jclass jlrM(JNIEnv *env) { + jclass cls = NULL; + + cls = JNI_ENV_PTR(env)->FindClass(JNI_ENV_ARG(env, MOD_CNAME)); + if (cls == NULL) { + printf(" Error in JNI FindClass: %s\n", MOD_CNAME); + } + return cls; +} + +jmethodID +get_method(JNIEnv *env, jclass clazz, const char * name, const char *sig) { + jmethodID method = NULL; + + method = JNI_ENV_PTR(env)->GetMethodID(JNI_ENV_ARG(env, clazz), name, sig); + if (method == NULL) { + printf(" Error in JNI GetMethodID %s with signature %s", name, sig); + } + return method; +} + +static +jboolean can_use_service(JNIEnv *env, jobject module, jclass service) { + static jmethodID mCanUse = NULL; + jboolean res = JNI_FALSE; + + if (mCanUse == NULL) { + const char* sign = "(Ljava/lang/Class;)Z"; + mCanUse = get_method(env, jlrM(env), "canUse", sign); + } + res = JNI_ENV_PTR(env)->CallBooleanMethod(JNI_ENV_ARG(env, module), + mCanUse, service); + return res; +} + +JNIEXPORT jint JNICALL +Java_MyPackage_AddModuleUsesAndProvidesTest_checkUses(JNIEnv *env, + jclass cls, + jobject baseModule, + jclass service) { + jvmtiError err = JVMTI_ERROR_NONE; + jboolean used = JNI_FALSE; + + // Add a service to use to NULL module + printf("Check #UN1:\n"); + err = (*jvmti)->AddModuleUses(jvmti, NULL, service); + if (err != JVMTI_ERROR_NULL_POINTER) { + printf("#UN1: jvmtiError from AddModuleUses: %d\n", err); + throw_exc(env, "Check #UN1: failed to return JVMTI_ERROR_NULL_POINTER for module==NULL"); + return FAILED; + } + + // Add NULL service to use to baseModule + printf("Check #UN2:\n"); + err = (*jvmti)->AddModuleUses(jvmti, baseModule, NULL); + if (err != JVMTI_ERROR_NULL_POINTER) { + printf("#UN2: jvmtiError from AddModuleUses: %d\n", err); + throw_exc(env, "Check #UN2: failed to return JVMTI_ERROR_NULL_POINTER for service==NULL"); + return FAILED; + } + + // Add service to use to invalid module (cls) + printf("Check #UI1:\n"); + err = (*jvmti)->AddModuleUses(jvmti, (jobject)cls, service); + if (err != JVMTI_ERROR_INVALID_MODULE) { + printf("#UI1: jvmtiError from AddModuleUses: %d\n", err); + throw_exc(env, "Check #UI1: did not get expected JVMTI_ERROR_INVALID_MODULE for invalid module"); + return FAILED; + } + + // Add invalid service (thisModule) to use to baseModule + printf("Check #UI2:\n"); + err = (*jvmti)->AddModuleUses(jvmti, baseModule, baseModule); + if (err != JVMTI_ERROR_INVALID_CLASS) { + printf("#UI2: jvmtiError from AddModuleUses: %d\n", err); + throw_exc(env, "Check #UI2: did not get expected JVMTI_ERROR_INVALID_CLASS for invalid service"); + return FAILED; + } + + // Check if the service can not be used + printf("Check #UC1:\n"); + used = can_use_service(env, baseModule, service); + if (used != JNI_FALSE) { + throw_exc(env, "Check #UC1: unexpected use of service"); + return FAILED; + } + + // Add uses of a correct service + printf("Check #UC2:\n"); + err = (*jvmti)->AddModuleUses(jvmti, baseModule, service); + if (err != JVMTI_ERROR_NONE) { + printf("#UC2: jvmtiError from AddModuleUses: %d\n", err); + throw_exc(env, "Check #UC2: got unexpected JVMTI error"); + return FAILED; + } + + // Check if the service can not be used + printf("Check #UC3:\n"); + used = can_use_service(env, baseModule, service); + if (used == JNI_FALSE) { + throw_exc(env, "Check #UC3: service can not be used unexpectedly"); + return FAILED; + } + fflush(0); + return PASSED; +} + +JNIEXPORT jint JNICALL +Java_MyPackage_AddModuleUsesAndProvidesTest_checkProvides(JNIEnv *env, + jclass cls, + jobject baseModule, + jclass service, + jclass serviceImpl) { + jvmtiError err = JVMTI_ERROR_NONE; + jboolean provided = JNI_FALSE; + + // Add provides to NULL module + printf("Check #PN1:\n"); + err = (*jvmti)->AddModuleProvides(jvmti, NULL, service, serviceImpl); + if (err != JVMTI_ERROR_NULL_POINTER) { + printf("#PN1: jvmtiError from AddModuleProvides: %d\n", err); + throw_exc(env, "Check #PN1: failed to return JVMTI_ERROR_NULL_POINTER for module==NULL"); + return FAILED; + } + + // Add provides with NULL service + printf("Check #PN2:\n"); + err = (*jvmti)->AddModuleProvides(jvmti, baseModule, NULL, serviceImpl); + if (err != JVMTI_ERROR_NULL_POINTER) { + printf("#PN2: jvmtiError from AddModuleProvides: %d\n", err); + throw_exc(env, "Check #PN2: failed to return JVMTI_ERROR_NULL_POINTER for service==NULL"); + return FAILED; + } + + // Add provides with NULL serviceImpl + printf("Check #PN3:\n"); + err = (*jvmti)->AddModuleProvides(jvmti, baseModule, service, NULL); + if (err != JVMTI_ERROR_NULL_POINTER) { + printf("#PN3: jvmtiError from AddModuleProvides: %d\n", err); + throw_exc(env, "Check #PN3: failed to return JVMTI_ERROR_NULL_POINTER for serviceImpl==NULL"); + return FAILED; + } + + // Add provides to invalid module (cls) + printf("Check #PI1:\n"); + err = (*jvmti)->AddModuleProvides(jvmti, (jobject)cls, service, serviceImpl); + if (err != JVMTI_ERROR_INVALID_MODULE) { + printf("#PI1: jvmtiError from AddModuleProvides: %d\n", err); + throw_exc(env, "Check #PI1: did not get expected JVMTI_ERROR_INVALID_MODULE for invalid module"); + return FAILED; + } + + // Add provides with invalid service (baseModule) + printf("Check #PI2:\n"); + err = (*jvmti)->AddModuleProvides(jvmti, baseModule, baseModule, serviceImpl); + if (err != JVMTI_ERROR_INVALID_CLASS) { + printf("#PI2: jvmtiError from AddModuleProvides: %d\n", err); + throw_exc(env, "Check #PI2: did not get expected JVMTI_ERROR_INVALID_CLASS for invalid service"); + return FAILED; + } + + // Add provides with invalid serviceImpl (baseModule) + printf("Check #PI3:\n"); + err = (*jvmti)->AddModuleProvides(jvmti, baseModule, service, baseModule); + if (err != JVMTI_ERROR_INVALID_CLASS) { + printf("#PI3: jvmtiError from AddModuleProvides: %d\n", err); + throw_exc(env, "Check #PI3: did not get expected JVMTI_ERROR_INVALID_CLASS for invalid serviceImpl"); + return FAILED; + } + + // Add provides to baseModule with correct service and serviceImpl + printf("Check #PC2:\n"); + err = (*jvmti)->AddModuleProvides(jvmti, baseModule, service, serviceImpl); + if (err != JVMTI_ERROR_NONE) { + printf("#PC2: jvmtiError from AddModuleExports: %d\n", err); + throw_exc(env, "Check #PC2: error in add provides to baseModule with correct service and serviceImpl"); + return FAILED; + } + fflush(0); + return PASSED; +} + +#ifdef __cplusplus +} +#endif
--- a/hotspot/test/serviceability/jvmti/GetModulesInfo/JvmtiGetAllModulesTest.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/serviceability/jvmti/GetModulesInfo/JvmtiGetAllModulesTest.java Wed Jul 05 22:32:06 2017 +0200 @@ -72,8 +72,7 @@ // Load a new named module ModuleDescriptor descriptor - = new ModuleDescriptor.Builder(MY_MODULE_NAME) - .build(); + = ModuleDescriptor.module(MY_MODULE_NAME).build(); ModuleFinder finder = finderOf(descriptor); ClassLoader loader = new ClassLoader() {}; Configuration parent = Layer.boot().configuration();
--- a/hotspot/test/serviceability/sa/TestInstanceKlassSize.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/serviceability/sa/TestInstanceKlassSize.java Wed Jul 05 22:32:06 2017 +0200 @@ -46,6 +46,7 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * @compile -XDignore.symbol.file=true + * --add-modules=jdk.hotspot.agent * --add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED * --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED * --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED
--- a/hotspot/test/serviceability/sa/TestInstanceKlassSizeForInterface.java Fri Dec 02 10:52:51 2016 -0800 +++ b/hotspot/test/serviceability/sa/TestInstanceKlassSizeForInterface.java Wed Jul 05 22:32:06 2017 +0200 @@ -39,6 +39,7 @@ * @library /test/lib * @modules java.base/jdk.internal.misc * @compile -XDignore.symbol.file=true + * --add-modules=jdk.hotspot.agent * --add-exports=jdk.hotspot.agent/sun.jvm.hotspot=ALL-UNNAMED * --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.utilities=ALL-UNNAMED * --add-exports=jdk.hotspot.agent/sun.jvm.hotspot.oops=ALL-UNNAMED
--- a/jdk/.hgignore Fri Dec 02 10:52:51 2016 -0800 +++ b/jdk/.hgignore Wed Jul 05 22:32:06 2017 +0200 @@ -5,7 +5,6 @@ /nbproject/private/ ^make/netbeans/.*/build/ ^make/netbeans/.*/dist/ -^.hgtip .DS_Store .*/JTreport/.* .*/JTwork/.*
--- a/jdk/.hgtags Fri Dec 02 10:52:51 2016 -0800 +++ b/jdk/.hgtags Wed Jul 05 22:32:06 2017 +0200 @@ -389,3 +389,4 @@ efa71dc820eb8bd5a6c9f2f66f39c383ac3ee99d jdk-9+144 99b7853cfbd8227c4441de4b6119c10742556840 jdk-9+145 6e4ff59afb5d0adf21a72c4ff534326594a99e5d jdk-9+146 +c41140100bf1e5c10c7b8f3bde91c16eff7485f5 jdk-9+147
--- a/jdk/make/data/jdwp/jdwp.spec Fri Dec 02 10:52:51 2016 -0800 +++ b/jdk/make/data/jdwp/jdwp.spec Wed Jul 05 22:32:06 2017 +0200 @@ -2709,22 +2709,6 @@ (Error VM_DEAD) ) ) - (Command CanRead=3 - "Returns true if this module can read the source module; false otherwise." - "<p>Since JDWP version 9." - (Out - (moduleID module "This module.") - (moduleID sourceModule "The source module.") - ) - (Reply - (boolean canRead "true if this module can read the source module; false otherwise.") - ) - (ErrorSet - (Error INVALID_MODULE "This module or sourceModule is not the ID of a module.") - (Error NOT_IMPLEMENTED) - (Error VM_DEAD) - ) - ) ) (CommandSet Event=64 (Command Composite=100
--- a/jdk/make/gensrc/GensrcMisc.gmk Fri Dec 02 10:52:51 2016 -0800 +++ b/jdk/make/gensrc/GensrcMisc.gmk Wed Jul 05 22:32:06 2017 +0200 @@ -108,3 +108,19 @@ endif ################################################################################ +# Create the javax/crypto/JceSecurity.class, using the build default. +# +ifeq ($(UNLIMITED_CRYPTO), true) + JCE_DEFAULT_POLICY = unlimited +else + JCE_DEFAULT_POLICY = limited +endif + +$(eval $(call SetupTextFileProcessing, BUILD_JCESECURITY_JAVA, \ + SOURCE_FILES := $(JDK_TOPDIR)/src/java.base/share/classes/javax/crypto/JceSecurity.java.template, \ + OUTPUT_FILE := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/javax/crypto/JceSecurity.java, \ + REPLACEMENTS := \ + @@JCE_DEFAULT_POLICY@@ => $(JCE_DEFAULT_POLICY), \ +)) + +GENSRC_JAVA_BASE += $(BUILD_JCESECURITY_JAVA)
--- a/jdk/make/launcher/Launcher-jdk.jconsole.gmk Fri Dec 02 10:52:51 2016 -0800 +++ b/jdk/make/launcher/Launcher-jdk.jconsole.gmk Wed Jul 05 22:32:06 2017 +0200 @@ -27,7 +27,8 @@ $(eval $(call SetupBuildLauncher, jconsole, \ MAIN_CLASS := sun.tools.jconsole.JConsole, \ - JAVA_ARGS := -Djconsole.showOutputViewer, \ + JAVA_ARGS := --add-opens java.base/java.io=jdk.jconsole \ + -Djconsole.showOutputViewer, \ CFLAGS_windows := -DJAVAW, \ LIBS_windows := user32.lib, \ ))
--- a/jdk/make/lib/Awt2dLibraries.gmk Fri Dec 02 10:52:51 2016 -0800 +++ b/jdk/make/lib/Awt2dLibraries.gmk Wed Jul 05 22:32:06 2017 +0200 @@ -287,9 +287,8 @@ $(JDK_TOPDIR)/src/java.desktop/share/native/common/awt/debug \ $(JDK_TOPDIR)/src/java.desktop/share/native/common/awt/utility \ $(JDK_TOPDIR)/src/java.desktop/share/native/common/font \ - $(JDK_TOPDIR)/src/java.desktop/share/native/common/java2d/opengl \ - $(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/common/java2d/opengl \ - $(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/common/java2d/x11 \ + $(JDK_TOPDIR)/src/java.desktop/share/native/common/java2d \ + $(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/common/java2d \ $(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/common/awt \ # @@ -396,7 +395,7 @@ ifeq ($(USE_EXTERNAL_LCMS), true) # If we're using an external library, we'll just need the wrapper part. - # By including it explicitely, all other files will be excluded. + # By including it explicitly, all other files will be excluded. BUILD_LIBLCMS_INCLUDE_FILES := LCMS.c else BUILD_LIBLCMS_INCLUDE_FILES := @@ -516,24 +515,25 @@ LIBAWT_HEADLESS_DIRS := $(JDK_TOPDIR)/src/java.desktop/unix/native/libawt_headless/awt \ $(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/common/awt \ - $(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/common/java2d/opengl \ - $(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/common/java2d/x11 \ - $(JDK_TOPDIR)/src/java.desktop/share/native/common/java2d/opengl \ + $(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/common/java2d \ + $(JDK_TOPDIR)/src/java.desktop/share/native/common/java2d \ $(JDK_TOPDIR)/src/java.desktop/share/native/common/font \ # LIBAWT_HEADLESS_EXCLUDES := medialib LIBAWT_HEADLESS_CFLAGS := -I$(SUPPORT_OUTPUTDIR)/headers/java.desktop \ $(addprefix -I, $(LIBAWT_HEADLESS_DIRS)) \ + -I$(JDK_TOPDIR)/src/java.desktop/share/native/libawt/awt/image \ + -I$(JDK_TOPDIR)/src/java.desktop/share/native/libawt/awt/image/cvutils \ -I$(JDK_TOPDIR)/src/java.desktop/share/native/libawt/java2d \ + -I$(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/libawt/java2d \ -I$(JDK_TOPDIR)/src/java.desktop/share/native/libawt/java2d/loops \ - -I$(JDK_TOPDIR)/src/java.desktop/share/native/libawt/awt/image/cvutils \ -I$(JDK_TOPDIR)/src/java.desktop/share/native/libawt/java2d/pipe \ - -I$(JDK_TOPDIR)/src/java.desktop/share/native/libawt/awt/image \ - -I$(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/libawt/java2d \ + -I$(JDK_TOPDIR)/src/java.desktop/share/native/common/awt/debug \ -I$(JDK_TOPDIR)/src/java.desktop/share/native/common/font \ - -I$(JDK_TOPDIR)/src/java.desktop/share/native/common/awt/debug \ -I$(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/common/font \ + -I$(JDK_TOPDIR)/src/java.desktop/share/native/common/java2d/opengl \ + -I$(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/common/java2d/opengl \ -I$(JDK_TOPDIR)/src/java.desktop/$(OPENJDK_TARGET_OS_TYPE)/native/libsunwjdga/ \ $(LIBJAVA_HEADER_FLAGS) \ # @@ -862,7 +862,7 @@ ifeq ($(OPENJDK_TARGET_OS), windows) LIBSPLASHSCREEN_DIRS += $(JDK_TOPDIR)/src/java.desktop/windows/native/common/awt/systemscale - endif + endif LIBSPLASHSCREEN_CFLAGS += -DSPLASHSCREEN -DPNG_NO_MMX_CODE -DPNG_ARM_NEON_OPT=0 \ $(addprefix -I, $(LIBSPLASHSCREEN_DIRS)) \ $(LIBJAVA_HEADER_FLAGS) \ @@ -952,26 +952,27 @@ $(JDK_TOPDIR)/src/java.desktop/macosx/native/libawt_lwawt \ $(JDK_TOPDIR)/src/java.desktop/unix/native/common/awt \ $(JDK_TOPDIR)/src/java.desktop/share/native/common/font \ - $(JDK_TOPDIR)/src/java.desktop/share/native/common/java2d/opengl \ + $(JDK_TOPDIR)/src/java.desktop/share/native/common/java2d \ # LIBAWT_LWAWT_CFLAGS := \ $(addprefix -I, $(LIBAWT_LWAWT_DIRS)) \ -I$(SUPPORT_OUTPUTDIR)/headers/java.desktop \ - -I$(JDK_TOPDIR)/src/java.desktop/macosx/native/include \ - -I$(JDK_TOPDIR)/src/java.desktop/share/native/include \ - -I$(JDK_TOPDIR)/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl \ -I$(JDK_TOPDIR)/src/java.desktop/macosx/native/libawt_lwawt/awt \ -I$(JDK_TOPDIR)/src/java.desktop/unix/native/libawt_xawt/awt \ -I$(JDK_TOPDIR)/src/java.desktop/macosx/native/libawt_lwawt/font \ + -I$(JDK_TOPDIR)/src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl \ + -I$(JDK_TOPDIR)/src/java.desktop/share/native/common/awt/debug \ + -I$(JDK_TOPDIR)/src/java.desktop/share/native/common/java2d/opengl \ + -I$(JDK_TOPDIR)/src/java.desktop/macosx/native/include \ + -I$(JDK_TOPDIR)/src/java.desktop/share/native/include \ -I$(JDK_TOPDIR)/src/java.desktop/share/native/libawt/awt/image \ + -I$(JDK_TOPDIR)/src/java.desktop/share/native/libawt/awt/image/cvutils \ -I$(JDK_TOPDIR)/src/java.desktop/share/native/libawt/java2d \ -I$(JDK_TOPDIR)/src/java.desktop/unix/native/libawt/java2d \ - -I$(JDK_TOPDIR)/src/java.desktop/share/native/libmlib_image/ \ - -I$(JDK_TOPDIR)/src/java.desktop/share/native/libawt/awt/image/cvutils \ -I$(JDK_TOPDIR)/src/java.desktop/share/native/libawt/java2d/loops \ -I$(JDK_TOPDIR)/src/java.desktop/share/native/libawt/java2d/pipe \ - -I$(JDK_TOPDIR)/src/java.desktop/share/native/common/awt/debug \ + -I$(JDK_TOPDIR)/src/java.desktop/share/native/libmlib_image/ \ -I$(JDK_TOPDIR)/src/java.desktop/macosx/native/libosxapp \ $(LIBJAVA_HEADER_FLAGS) \ #
--- a/jdk/make/lib/CoreLibraries.gmk Fri Dec 02 10:52:51 2016 -0800 +++ b/jdk/make/lib/CoreLibraries.gmk Wed Jul 05 22:32:06 2017 +0200 @@ -33,10 +33,22 @@ # libfdlibm is statically linked with libjava below and not delivered into the # product on its own. -BUILD_LIBFDLIBM_OPTIMIZATION := HIGH +BUILD_LIBFDLIBM_OPTIMIZATION := NONE + +ifeq ($(OPENJDK_TARGET_OS), solaris) + BUILD_LIBFDLIBM_OPTIMIZATION := HIGH +endif -ifneq ($(OPENJDK_TARGET_OS), solaris) - BUILD_LIBFDLIBM_OPTIMIZATION := NONE +ifeq ($(OPENJDK_TARGET_OS), linux) + ifeq ($(OPENJDK_TARGET_CPU), ppc64) + BUILD_LIBFDLIBM_OPTIMIZATION := HIGH + else ifeq ($(OPENJDK_TARGET_CPU), ppc64le) + BUILD_LIBFDLIBM_OPTIMIZATION := HIGH + else ifeq ($(OPENJDK_TARGET_CPU), s390x) + BUILD_LIBFDLIBM_OPTIMIZATION := HIGH + else ifeq ($(OPENJDK_TARGET_CPU), aarch64) + BUILD_LIBFDLIBM_OPTIMIZATION := HIGH + endif endif LIBFDLIBM_SRC := $(JDK_TOPDIR)/src/java.base/share/native/libfdlibm @@ -51,6 +63,10 @@ CFLAGS := $(CFLAGS_JDKLIB) $(LIBFDLIBM_CFLAGS), \ CFLAGS_windows_debug := -DLOGGING, \ CFLAGS_aix := -qfloat=nomaf, \ + CFLAGS_linux_ppc64 := -ffp-contract=off, \ + CFLAGS_linux_ppc64le := -ffp-contract=off, \ + CFLAGS_linux_s390x := -ffp-contract=off, \ + CFLAGS_linux_aarch64 := -ffp-contract=off, \ DISABLED_WARNINGS_gcc := sign-compare, \ DISABLED_WARNINGS_microsoft := 4146 4244 4018, \ ARFLAGS := $(ARFLAGS), \
--- a/jdk/make/src/classes/build/tools/jigsaw/AddPackagesAttribute.java Fri Dec 02 10:52:51 2016 -0800 +++ b/jdk/make/src/classes/build/tools/jigsaw/AddPackagesAttribute.java Wed Jul 05 22:32:06 2017 +0200 @@ -65,7 +65,7 @@ String mn = entry.getFileName().toString(); Optional<ModuleReference> omref = finder.find(mn); if (omref.isPresent()) { - Set<String> packages = omref.get().descriptor().conceals(); + Set<String> packages = omref.get().descriptor().packages(); addPackagesAttribute(mi, packages); } } @@ -77,7 +77,7 @@ byte[] bytes; try (InputStream in = Files.newInputStream(mi)) { ModuleInfoExtender extender = ModuleInfoExtender.newExtender(in); - extender.conceals(packages); + extender.packages(packages); ByteArrayOutputStream baos = new ByteArrayOutputStream(); extender.write(baos); bytes = baos.toByteArray();
--- a/jdk/make/src/classes/build/tools/jigsaw/GenGraphs.java Fri Dec 02 10:52:51 2016 -0800 +++ b/jdk/make/src/classes/build/tools/jigsaw/GenGraphs.java Wed Jul 05 22:32:06 2017 +0200 @@ -43,7 +43,7 @@ import java.util.TreeSet; import java.util.function.Function; import java.util.stream.Collectors; -import static java.lang.module.ModuleDescriptor.Requires.Modifier.PUBLIC; +import static java.lang.module.ModuleDescriptor.Requires.Modifier.TRANSITIVE; /** * Generate the DOT file for a module graph for each module in the JDK @@ -172,14 +172,14 @@ Graph<String> graph = gengraph(cf); descriptors.forEach(md -> { String mn = md.name(); - Set<String> requiresPublic = md.requires().stream() - .filter(d -> d.modifiers().contains(PUBLIC)) + Set<String> requiresTransitive = md.requires().stream() + .filter(d -> d.modifiers().contains(TRANSITIVE)) .map(d -> d.name()) .collect(Collectors.toSet()); graph.adjacentNodes(mn).forEach(dn -> { String attr = dn.equals("java.base") ? REQUIRES_BASE - : (requiresPublic.contains(dn) ? REEXPORTS : REQUIRES); + : (requiresTransitive.contains(dn) ? REEXPORTS : REQUIRES); int w = weightOf(mn, dn); if (w > 1) attr += "weight=" + w; @@ -194,8 +194,8 @@ /** * Returns a Graph of the given Configuration after transitive reduction. * - * Transitive reduction of requires public edge and requires edge have - * to be applied separately to prevent the requires public edges + * Transitive reduction of requires transitive edge and requires edge have + * to be applied separately to prevent the requires transitive edges * (e.g. U -> V) from being reduced by a path (U -> X -> Y -> V) * in which V would not be re-exported from U. */ @@ -208,21 +208,21 @@ .map(ResolvedModule::name) .forEach(target -> builder.addEdge(mn, target)); } - Graph<String> rpg = requiresPublicGraph(cf); + Graph<String> rpg = requiresTransitiveGraph(cf); return builder.build().reduce(rpg); } /** - * Returns a Graph containing only requires public edges + * Returns a Graph containing only requires transitive edges * with transitive reduction. */ - private Graph<String> requiresPublicGraph(Configuration cf) { + private Graph<String> requiresTransitiveGraph(Configuration cf) { Graph.Builder<String> builder = new Graph.Builder<>(); for (ResolvedModule resolvedModule : cf.modules()) { ModuleDescriptor descriptor = resolvedModule.reference().descriptor(); String mn = descriptor.name(); descriptor.requires().stream() - .filter(d -> d.modifiers().contains(PUBLIC)) + .filter(d -> d.modifiers().contains(TRANSITIVE)) .map(d -> d.name()) .forEach(d -> builder.addEdge(mn, d)); }
--- a/jdk/make/src/classes/build/tools/jigsaw/ModuleSummary.java Fri Dec 02 10:52:51 2016 -0800 +++ b/jdk/make/src/classes/build/tools/jigsaw/ModuleSummary.java Wed Jul 05 22:32:06 2017 +0200 @@ -299,7 +299,7 @@ static class HtmlDocument { final String title; final Map<String, ModuleSummary> modules; - boolean requiresPublicNote = false; + boolean requiresTransitiveNote = false; boolean aggregatorNote = false; boolean totalBytesNote = false; HtmlDocument(String title, Map<String, ModuleSummary> modules) { @@ -510,16 +510,16 @@ public String requiresColumn() { StringBuilder sb = new StringBuilder(); sb.append(String.format("<td>")); - boolean footnote = requiresPublicNote; + boolean footnote = requiresTransitiveNote; ms.descriptor().requires().stream() .sorted(Comparator.comparing(Requires::name)) .forEach(r -> { - boolean requiresPublic = r.modifiers().contains(Requires.Modifier.PUBLIC); - Selector sel = requiresPublic ? REQUIRES_PUBLIC : REQUIRES; + boolean requiresTransitive = r.modifiers().contains(Requires.Modifier.TRANSITIVE); + Selector sel = requiresTransitive ? REQUIRES_PUBLIC : REQUIRES; String req = String.format("<a class=\"%s\" href=\"#%s\">%s</a>", sel, r.name(), r.name()); - if (!requiresPublicNote && requiresPublic) { - requiresPublicNote = true; + if (!requiresTransitiveNote && requiresTransitive) { + requiresTransitiveNote = true; req += "<sup>*</sup>"; } sb.append(req).append("\n").append("<br>"); @@ -534,8 +534,8 @@ sb.append("<br>"); sb.append("<i>+").append(indirectDeps).append(" transitive dependencies</i>"); } - if (footnote != requiresPublicNote) { - sb.append("<br><br>").append("<i>* bold denotes requires public</i>"); + if (footnote != requiresTransitiveNote) { + sb.append("<br><br>").append("<i>* bold denotes requires transitive</i>"); } sb.append("</td>"); return sb.toString(); @@ -558,11 +558,10 @@ ms.descriptor().uses().stream() .sorted() .forEach(s -> sb.append("uses ").append(s).append("<br>").append("\n")); - ms.descriptor().provides().entrySet().stream() - .sorted(Map.Entry.comparingByKey()) - .flatMap(e -> e.getValue().providers().stream() - .map(p -> String.format("provides %s<br> with %s", - e.getKey(), p))) + ms.descriptor().provides().stream() + .sorted(Comparator.comparing(Provides::service)) + .map(p -> String.format("provides %s<br> with %s", + p.service(), p.providers())) .forEach(p -> sb.append(p).append("<br>").append("\n")); sb.append("</td>"); return sb.toString();
--- a/jdk/make/src/classes/build/tools/module/GenModuleInfoSource.java Fri Dec 02 10:52:51 2016 -0800 +++ b/jdk/make/src/classes/build/tools/module/GenModuleInfoSource.java Wed Jul 05 22:32:06 2017 +0200 @@ -30,219 +30,594 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; -import java.util.stream.Collectors; +import java.util.stream.Stream; +import static java.util.stream.Collectors.*; /** * A build tool to extend the module-info.java in the source tree for - * platform-specific exports, uses, and provides and write to the specified - * output file. Injecting platform-specific requires is not supported. + * platform-specific exports, opens, uses, and provides and write to + * the specified output file. + * + * GenModuleInfoSource will be invoked for each module that has + * module-info.java.extra in the source directory. * - * The extra exports, uses, provides can be specified in module-info.java.extra - * files and GenModuleInfoSource will be invoked for each module that has - * module-info.java.extra in the source directory. + * The extra exports, opens, uses, provides can be specified + * in module-info.java.extra. + * Injecting platform-specific requires is not supported. + * + * @see build.tools.module.ModuleInfoExtraTest for basic testing */ public class GenModuleInfoSource { private final static String USAGE = - "Usage: GenModuleInfoSource [option] -o <output file> <module-info-java>\n" + - "Options are:\n" + - " -exports <package-name>\n" + - " -exports <package-name>[/<module-name>]\n" + - " -uses <service>\n" + - " -provides <service>/<provider-impl-classname>\n"; + "Usage: GenModuleInfoSource -o <output file> \n" + + " --source-file <module-info-java>\n" + + " --modules <module-name>[,<module-name>...]\n" + + " <module-info.java.extra> ...\n"; + static boolean verbose = false; public static void main(String... args) throws Exception { Path outfile = null; Path moduleInfoJava = null; - GenModuleInfoSource genModuleInfo = new GenModuleInfoSource(); - + Set<String> modules = Collections.emptySet(); + List<Path> extras = new ArrayList<>(); // validate input arguments for (int i = 0; i < args.length; i++){ String option = args[i]; - if (option.startsWith("-")) { - String arg = args[++i]; - if (option.equals("-exports")) { - int index = arg.indexOf('/'); - if (index > 0) { - String pn = arg.substring(0, index); - String mn = arg.substring(index + 1, arg.length()); - genModuleInfo.exportTo(pn, mn); - } else { - genModuleInfo.export(arg); - } - } else if (option.equals("-uses")) { - genModuleInfo.use(arg); - } else if (option.equals("-provides")) { - int index = arg.indexOf('/'); - if (index <= 0) { - throw new IllegalArgumentException("invalid -provide argument: " + arg); - } - String service = arg.substring(0, index); - String impl = arg.substring(index + 1, arg.length()); - genModuleInfo.provide(service, impl); - } else if (option.equals("-o")) { + String arg = i+1 < args.length ? args[i+1] : null; + switch (option) { + case "-o": outfile = Paths.get(arg); - } else { - throw new IllegalArgumentException("invalid option: " + option); - } - } else if (moduleInfoJava != null) { - throw new IllegalArgumentException("more than one module-info.java"); - } else { - moduleInfoJava = Paths.get(option); - if (Files.notExists(moduleInfoJava)) { - throw new IllegalArgumentException(option + " not exist"); - } + i++; + break; + case "--source-file": + moduleInfoJava = Paths.get(arg); + if (Files.notExists(moduleInfoJava)) { + throw new IllegalArgumentException(moduleInfoJava + " not exist"); + } + i++; + break; + case "--modules": + modules = Arrays.stream(arg.split(",")) + .collect(toSet()); + i++; + break; + case "-v": + verbose = true; + break; + default: + Path file = Paths.get(option); + if (Files.notExists(file)) { + throw new IllegalArgumentException(file + " not exist"); + } + extras.add(file); } } - if (moduleInfoJava == null || outfile == null) { + if (moduleInfoJava == null || outfile == null || + modules.isEmpty() || extras.isEmpty()) { System.err.println(USAGE); System.exit(-1); } - // generate new module-info.java - genModuleInfo.generate(moduleInfoJava, outfile); - } + GenModuleInfoSource genModuleInfo = + new GenModuleInfoSource(moduleInfoJava, extras, modules); - private final Set<String> exports = new HashSet<>(); - private final Map<String, Set<String>> exportsTo = new HashMap<>(); - private final Set<String> uses = new HashSet<>(); - private final Map<String, Set<String>> provides = new HashMap<>(); - GenModuleInfoSource() { + // generate new module-info.java + genModuleInfo.generate(outfile); } - private void export(String p) { - Objects.requireNonNull(p); - if (exports.contains(p) || exportsTo.containsKey(p)) { - throw new RuntimeException("duplicated exports: " + p); + final Path sourceFile; + final List<Path> extraFiles; + final ModuleInfo extras; + final Set<String> modules; + final ModuleInfo moduleInfo; + GenModuleInfoSource(Path sourceFile, List<Path> extraFiles, Set<String> modules) + throws IOException + { + this.sourceFile = sourceFile; + this.extraFiles = extraFiles; + this.modules = modules; + this.moduleInfo = new ModuleInfo(); + this.moduleInfo.parse(sourceFile); + + // parse module-info.java.extra + this.extras = new ModuleInfo(); + for (Path file : extraFiles) { + extras.parse(file); } - exports.add(p); - } - private void exportTo(String p, String mn) { - Objects.requireNonNull(p); - Objects.requireNonNull(mn); - if (exports.contains(p)) { - throw new RuntimeException("unqualified exports already exists: " + p); - } - exportsTo.computeIfAbsent(p, _k -> new HashSet<>()).add(mn); + + // merge with module-info.java.extra + moduleInfo.augmentModuleInfo(extras, modules); } - private void use(String service) { - uses.add(service); - } + void generate(Path output) throws IOException { + List<String> lines = Files.readAllLines(sourceFile); + try (BufferedWriter bw = Files.newBufferedWriter(output); + PrintWriter writer = new PrintWriter(bw)) { + // write the copyright header and lines up to module declaration + for (String l : lines) { + writer.println(l); + if (l.trim().startsWith("module ")) { + // print URI rather than file path to avoid escape + writer.format(" // source file: %s%n", sourceFile.toUri()); + for (Path file: extraFiles) { + writer.format(" // %s%n", file.toUri()); + } + break; + } + } - private void provide(String s, String impl) { - provides.computeIfAbsent(s, _k -> new HashSet<>()).add(impl); + // requires + for (String l : lines) { + if (l.trim().startsWith("requires")) + writer.println(l); + } + + // write exports, opens, uses, and provides + moduleInfo.print(writer); + + // close + writer.println("}"); + } } - private void generate(Path sourcefile, Path outfile) throws IOException { - Path parent = outfile.getParent(); - if (parent != null) - Files.createDirectories(parent); + + class ModuleInfo { + final Map<String, Statement> exports = new HashMap<>(); + final Map<String, Statement> opens = new HashMap<>(); + final Map<String, Statement> uses = new HashMap<>(); + final Map<String, Statement> provides = new HashMap<>(); + + Statement getStatement(String directive, String name) { + switch (directive) { + case "exports": + if (moduleInfo.exports.containsKey(name) && + moduleInfo.exports.get(name).isUnqualified()) { + throw new IllegalArgumentException(sourceFile + + " already has " + directive + " " + name); + } + return exports.computeIfAbsent(name, + _n -> new Statement("exports", "to", name)); + + case "opens": + if (moduleInfo.opens.containsKey(name) && + moduleInfo.opens.get(name).isUnqualified()) { + throw new IllegalArgumentException(sourceFile + + " already has " + directive + " " + name); + } + + if (moduleInfo.opens.containsKey(name)) { + throw new IllegalArgumentException(sourceFile + + " already has " + directive + " " + name); + } + return opens.computeIfAbsent(name, + _n -> new Statement("opens", "to", name)); + + case "uses": + return uses.computeIfAbsent(name, + _n -> new Statement("uses", "", name)); + + case "provides": + return provides.computeIfAbsent(name, + _n -> new Statement("provides", "with", name, true)); + + default: + throw new IllegalArgumentException(directive); + } + + } + + /* + * Augment this ModuleInfo with module-info.java.extra + */ + void augmentModuleInfo(ModuleInfo extraFiles, Set<String> modules) { + // API package exported in the original module-info.java + extraFiles.exports.entrySet() + .stream() + .filter(e -> exports.containsKey(e.getKey()) && + e.getValue().filter(modules)) + .forEach(e -> mergeExportsOrOpens(exports.get(e.getKey()), + e.getValue(), + modules)); + + // add exports that are not defined in the original module-info.java + extraFiles.exports.entrySet() + .stream() + .filter(e -> !exports.containsKey(e.getKey()) && + e.getValue().filter(modules)) + .forEach(e -> addTargets(getStatement("exports", e.getKey()), + e.getValue(), + modules)); + + // API package opened in the original module-info.java + extraFiles.opens.entrySet() + .stream() + .filter(e -> opens.containsKey(e.getKey()) && + e.getValue().filter(modules)) + .forEach(e -> mergeExportsOrOpens(opens.get(e.getKey()), + e.getValue(), + modules)); + + // add opens that are not defined in the original module-info.java + extraFiles.opens.entrySet() + .stream() + .filter(e -> !opens.containsKey(e.getKey()) && + e.getValue().filter(modules)) + .forEach(e -> addTargets(getStatement("opens", e.getKey()), + e.getValue(), + modules)); + + // provides + extraFiles.provides.keySet() + .stream() + .filter(service -> provides.containsKey(service)) + .forEach(service -> mergeProvides(service, + extraFiles.provides.get(service))); + extraFiles.provides.keySet() + .stream() + .filter(service -> !provides.containsKey(service)) + .forEach(service -> provides.put(service, + extraFiles.provides.get(service))); + + // uses + extraFiles.uses.keySet() + .stream() + .filter(service -> !uses.containsKey(service)) + .forEach(service -> uses.put(service, extraFiles.uses.get(service))); + } + + // add qualified exports or opens to known modules only + private void addTargets(Statement statement, + Statement extra, + Set<String> modules) + { + extra.targets.stream() + .filter(mn -> modules.contains(mn)) + .forEach(mn -> statement.addTarget(mn)); + } + + private void mergeExportsOrOpens(Statement statement, + Statement extra, + Set<String> modules) + { + String pn = statement.name; + if (statement.isUnqualified() && extra.isQualified()) { + throw new RuntimeException("can't add qualified exports to " + + "unqualified exports " + pn); + } + + Set<String> mods = extra.targets.stream() + .filter(mn -> statement.targets.contains(mn)) + .collect(toSet()); + if (mods.size() > 0) { + throw new RuntimeException("qualified exports " + pn + " to " + + mods.toString() + " already declared in " + sourceFile); + } + + // add qualified exports or opens to known modules only + addTargets(statement, extra, modules); + } + + private void mergeProvides(String service, Statement extra) { + Statement statement = provides.get(service); - List<String> lines = Files.readAllLines(sourcefile); - try (BufferedWriter bw = Files.newBufferedWriter(outfile); - PrintWriter writer = new PrintWriter(bw)) { - int lineNumber = 0; - for (String l : lines) { - lineNumber++; - String[] s = l.trim().split("\\s+"); - String keyword = s[0].trim(); - int nextIndex = keyword.length(); - String exp = null; - int n = l.length(); - switch (keyword) { - case "exports": - boolean inExportsTo = false; - // assume package name immediately after exports - exp = s[1].trim(); - if (s.length >= 3) { - nextIndex = l.indexOf(exp, nextIndex) + exp.length(); - if (s[2].trim().equals("to")) { - inExportsTo = true; - n = l.indexOf("to", nextIndex) + "to".length(); - } else { + Set<String> mods = extra.targets.stream() + .filter(mn -> statement.targets.contains(mn)) + .collect(toSet()); + + if (mods.size() > 0) { + throw new RuntimeException("qualified exports " + service + " to " + + mods.toString() + " already declared in " + sourceFile); + } + + extra.targets.stream() + .forEach(mn -> statement.addTarget(mn)); + } + + + void print(PrintWriter writer) { + // print unqualified exports + exports.entrySet().stream() + .filter(e -> e.getValue().targets.isEmpty()) + .sorted(Map.Entry.comparingByKey()) + .forEach(e -> writer.println(e.getValue())); + + // print qualified exports + exports.entrySet().stream() + .filter(e -> !e.getValue().targets.isEmpty()) + .sorted(Map.Entry.comparingByKey()) + .forEach(e -> writer.println(e.getValue())); + + // print unqualified opens + opens.entrySet().stream() + .filter(e -> e.getValue().targets.isEmpty()) + .sorted(Map.Entry.comparingByKey()) + .forEach(e -> writer.println(e.getValue())); + + // print qualified opens + opens.entrySet().stream() + .filter(e -> !e.getValue().targets.isEmpty()) + .sorted(Map.Entry.comparingByKey()) + .forEach(e -> writer.println(e.getValue())); + + // uses and provides + writer.println(); + uses.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .forEach(e -> writer.println(e.getValue())); + provides.entrySet().stream() + .sorted(Map.Entry.comparingByKey()) + .forEach(e -> writer.println(e.getValue())); + } + + private void parse(Path sourcefile) throws IOException { + List<String> lines = Files.readAllLines(sourcefile); + Statement statement = null; + boolean hasTargets = false; + + for (int lineNumber = 1; lineNumber <= lines.size(); ) { + String l = lines.get(lineNumber-1).trim(); + int index = 0; + + if (l.isEmpty()) { + lineNumber++; + continue; + } + + // comment block starts + if (l.startsWith("/*")) { + while (l.indexOf("*/") == -1) { // end comment block + l = lines.get(lineNumber++).trim(); + } + index = l.indexOf("*/") + 2; + if (index >= l.length()) { + lineNumber++; + continue; + } else { + // rest of the line + l = l.substring(index, l.length()).trim(); + index = 0; + } + } + + // skip comment and annotations + if (l.startsWith("//") || l.startsWith("@")) { + lineNumber++; + continue; + } + + int current = lineNumber; + int count = 0; + while (index < l.length()) { + if (current == lineNumber && ++count > 20) + throw new Error("Fail to parse line " + lineNumber + " " + sourcefile); + + int end = l.indexOf(';'); + if (end == -1) + end = l.length(); + String content = l.substring(0, end).trim(); + if (content.isEmpty()) { + index = end+1; + if (index < l.length()) { + // rest of the line + l = l.substring(index, l.length()).trim(); + index = 0; + } + continue; + } + + String[] s = content.split("\\s+"); + String keyword = s[0].trim(); + + String name = s.length > 1 ? s[1].trim() : null; + trace("%d: %s index=%d len=%d%n", lineNumber, l, index, l.length()); + switch (keyword) { + case "module": + case "requires": + case "}": + index = l.length(); // skip to the end + continue; + + case "exports": + case "opens": + case "provides": + case "uses": + // assume name immediately after exports, opens, provides, uses + statement = getStatement(keyword, name); + hasTargets = false; + + int i = l.indexOf(name, keyword.length()+1) + name.length() + 1; + l = i < l.length() ? l.substring(i, l.length()).trim() : ""; + index = 0; + + if (s.length >= 3) { + if (!s[2].trim().equals(statement.qualifier)) { + throw new RuntimeException(sourcefile + ", line " + + lineNumber + ", is malformed: " + s[2]); + } + } + + break; + + case "to": + case "with": + if (statement == null) { throw new RuntimeException(sourcefile + ", line " + - lineNumber + ", is malformed: " + s[2]); + lineNumber + ", is malformed"); } - } + + hasTargets = true; + String qualifier = statement.qualifier; + i = l.indexOf(qualifier, index) + qualifier.length() + 1; + l = i < l.length() ? l.substring(i, l.length()).trim() : ""; + index = 0; + break; + } - // inject the extra targets after "to" - if (inExportsTo) { - writer.println(injectExportTargets(exp, l, n)); + if (index >= l.length()) { + // skip to next line + continue; + } + + // comment block starts + if (l.startsWith("/*")) { + while (l.indexOf("*/") == -1) { // end comment block + l = lines.get(lineNumber++).trim(); + } + index = l.indexOf("*/") + 2; + if (index >= l.length()) { + continue; } else { - writer.println(l); + // rest of the line + l = l.substring(index, l.length()).trim(); + index = 0; } - break; - case "to": - if (exp == null) { - throw new RuntimeException(sourcefile + ", line " + - lineNumber + ", is malformed"); - } - n = l.indexOf("to", nextIndex) + "to".length(); - writer.println(injectExportTargets(exp, l, n)); - break; - case "}": - doAugments(writer); - // fall through - default: - writer.println(l); - // reset exports - exp = null; + } + + if (l.startsWith("//")) { + index = l.length(); + continue; + } + + if (statement == null) { + throw new RuntimeException(sourcefile + ", line " + + lineNumber + ": missing keyword?"); + } + + if (!hasTargets) { + continue; + } + + if (index >= l.length()) { + throw new RuntimeException(sourcefile + ", line " + + lineNumber + ": " + l); + } + + // parse the target module of exports, opens, or provides + Statement stmt = statement; + + int terminal = l.indexOf(';', index); + // determine up to which position to parse + int pos = terminal != -1 ? terminal : l.length(); + // parse up to comments + int pos1 = l.indexOf("//", index); + if (pos1 != -1 && pos1 < pos) { + pos = pos1; + } + int pos2 = l.indexOf("/*", index); + if (pos2 != -1 && pos2 < pos) { + pos = pos2; + } + // target module(s) for qualitifed exports or opens + // or provider implementation class(es) + String rhs = l.substring(index, pos).trim(); + index += rhs.length(); + trace("rhs: index=%d [%s] [line: %s]%n", index, rhs, l); + + String[] targets = rhs.split(","); + for (String t : targets) { + String n = t.trim(); + if (n.length() > 0) + stmt.addTarget(n); + } + + // start next statement + if (pos == terminal) { + statement = null; + hasTargets = false; + index = terminal + 1; + } + l = index < l.length() ? l.substring(index, l.length()).trim() : ""; + index = 0; } + + lineNumber++; } } } - private String injectExportTargets(String pn, String exp, int pos) { - Set<String> targets = exportsTo.remove(pn); - if (targets != null) { - StringBuilder sb = new StringBuilder(); - // inject the extra targets after the given pos - sb.append(exp.substring(0, pos)) - .append("\n\t") - .append(targets.stream() - .collect(Collectors.joining(",", "", ","))) - .append(" /* injected */"); - if (pos < exp.length()) { - // print the remaining statement followed "to" - sb.append("\n\t") - .append(exp.substring(pos+1, exp.length())); + static class Statement { + final String directive; + final String qualifier; + final String name; + final Set<String> targets = new LinkedHashSet<>(); + final boolean ordered; + + Statement(String directive, String qualifier, String name) { + this(directive, qualifier, name, false); + } + + Statement(String directive, String qualifier, String name, boolean ordered) { + this.directive = directive; + this.qualifier = qualifier; + this.name = name; + this.ordered = ordered; + } + + Statement addTarget(String mn) { + if (mn.isEmpty()) + throw new IllegalArgumentException("empty module name"); + targets.add(mn); + return this; + } + + boolean isQualified() { + return targets.size() > 0; + } + + boolean isUnqualified() { + return targets.isEmpty(); + } +