This commit is contained in:
Alejandro Murillo 2016-05-06 06:23:30 -07:00
commit 775606f20c
761 changed files with 29302 additions and 6851 deletions

View File

@ -358,3 +358,4 @@ a6614ff7bf09da74be1d0ef3d9755090d244697a jdk-9+111
6072af7a98be3922f26bdce71b53bb3646cb2ac9 jdk-9+113 6072af7a98be3922f26bdce71b53bb3646cb2ac9 jdk-9+113
c84d0cce090e161d736de69e941830adf8c2f87a jdk-9+114 c84d0cce090e161d736de69e941830adf8c2f87a jdk-9+114
8d78fb40648dd221ce4ef19f9d5aa41ee1a3a884 jdk-9+115 8d78fb40648dd221ce4ef19f9d5aa41ee1a3a884 jdk-9+115
84aba7335005a3a47751dcf1f37935f97df9f99a jdk-9+116

View File

@ -358,3 +358,4 @@ f900d5afd9c83a0df8f36161c27c5e4c86a66f4c jdk-9+111
55b6d550828d1223b364e6ead4a56e56411c56df jdk-9+113 55b6d550828d1223b364e6ead4a56e56411c56df jdk-9+113
1d992540870ff33fe6cc550443388588df9b9e4f jdk-9+114 1d992540870ff33fe6cc550443388588df9b9e4f jdk-9+114
09617ce980b99d49abfd54dacfed353c47e2a115 jdk-9+115 09617ce980b99d49abfd54dacfed353c47e2a115 jdk-9+115
6743a8e0cab7b5f6f4a0575f6664892f0ab740af jdk-9+116

View File

@ -397,6 +397,7 @@ AC_DEFUN_ONCE([BOOTJDK_SETUP_BOOT_JDK_ARGUMENTS],
ADD_JVM_ARG_IF_OK([-XX:+UseSerialGC],boot_jdk_jvmargs_small,[$JAVA]) ADD_JVM_ARG_IF_OK([-XX:+UseSerialGC],boot_jdk_jvmargs_small,[$JAVA])
ADD_JVM_ARG_IF_OK([-Xms32M],boot_jdk_jvmargs_small,[$JAVA]) ADD_JVM_ARG_IF_OK([-Xms32M],boot_jdk_jvmargs_small,[$JAVA])
ADD_JVM_ARG_IF_OK([-Xmx512M],boot_jdk_jvmargs_small,[$JAVA]) ADD_JVM_ARG_IF_OK([-Xmx512M],boot_jdk_jvmargs_small,[$JAVA])
ADD_JVM_ARG_IF_OK([-XX:TieredStopAtLevel=1],boot_jdk_jvmargs_small,[$JAVA])
AC_MSG_RESULT([$boot_jdk_jvmargs_small]) AC_MSG_RESULT([$boot_jdk_jvmargs_small])

View File

@ -31,7 +31,7 @@
export LEGACY_BUILD_DIR=@OPENJDK_TARGET_OS@-@OPENJDK_TARGET_CPU_LEGACY@ export LEGACY_BUILD_DIR=@OPENJDK_TARGET_OS@-@OPENJDK_TARGET_CPU_LEGACY@
sexport OPENJDK_TARGET_OS="@OPENJDK_TARGET_OS@" export OPENJDK_TARGET_OS="@OPENJDK_TARGET_OS@"
export OPENJDK_TARGET_CPU="@OPENJDK_TARGET_CPU@" export OPENJDK_TARGET_CPU="@OPENJDK_TARGET_CPU@"
export OPENJDK_TARGET_CPU_LIBDIR="@OPENJDK_TARGET_CPU_LIBDIR@" export OPENJDK_TARGET_CPU_LIBDIR="@OPENJDK_TARGET_CPU_LIBDIR@"
export DEBUG_LEVEL="@DEBUG_LEVEL@" export DEBUG_LEVEL="@DEBUG_LEVEL@"

View File

@ -1224,9 +1224,9 @@ with_lcms
with_dxsdk with_dxsdk
with_dxsdk_lib with_dxsdk_lib
with_dxsdk_include with_dxsdk_include
enable_jtreg_failure_handler
enable_new_hotspot_build enable_new_hotspot_build
enable_hotspot_test_in_build enable_hotspot_test_in_build
enable_jtreg_failure_handler
with_num_cores with_num_cores
with_memory_size with_memory_size
with_jobs with_jobs
@ -5070,7 +5070,7 @@ VS_SDK_PLATFORM_NAME_2013=
#CUSTOM_AUTOCONF_INCLUDE #CUSTOM_AUTOCONF_INCLUDE
# Do not change or remove the following line, it is needed for consistency checks: # Do not change or remove the following line, it is needed for consistency checks:
DATE_WHEN_GENERATED=1460963400 DATE_WHEN_GENERATED=1462204427
############################################################################### ###############################################################################
# #
@ -15492,7 +15492,7 @@ $as_echo "$COMPILE_TYPE" >&6; }
HOTSPOT_TARGET_CPU_DEFINE=PPC32 HOTSPOT_TARGET_CPU_DEFINE=PPC32
elif test "x$OPENJDK_TARGET_CPU" = xs390; then elif test "x$OPENJDK_TARGET_CPU" = xs390; then
HOTSPOT_TARGET_CPU_DEFINE=S390 HOTSPOT_TARGET_CPU_DEFINE=S390
elif test "x$OPENJDK_TARGET_CPU" = ss390x; then elif test "x$OPENJDK_TARGET_CPU" = xs390x; then
HOTSPOT_TARGET_CPU_DEFINE=S390 HOTSPOT_TARGET_CPU_DEFINE=S390
fi fi
@ -15648,7 +15648,7 @@ $as_echo "$COMPILE_TYPE" >&6; }
HOTSPOT_BUILD_CPU_DEFINE=PPC32 HOTSPOT_BUILD_CPU_DEFINE=PPC32
elif test "x$OPENJDK_BUILD_CPU" = xs390; then elif test "x$OPENJDK_BUILD_CPU" = xs390; then
HOTSPOT_BUILD_CPU_DEFINE=S390 HOTSPOT_BUILD_CPU_DEFINE=S390
elif test "x$OPENJDK_BUILD_CPU" = ss390x; then elif test "x$OPENJDK_BUILD_CPU" = xs390x; then
HOTSPOT_BUILD_CPU_DEFINE=S390 HOTSPOT_BUILD_CPU_DEFINE=S390
fi fi
@ -64282,6 +64282,21 @@ $as_echo_n "checking flags for boot jdk java command for small workloads... " >&
fi fi
$ECHO "Check if jvm arg is ok: -XX:TieredStopAtLevel=1" >&5
$ECHO "Command: $JAVA -XX:TieredStopAtLevel=1 -version" >&5
OUTPUT=`$JAVA -XX:TieredStopAtLevel=1 -version 2>&1`
FOUND_WARN=`$ECHO "$OUTPUT" | grep -i warn`
FOUND_VERSION=`$ECHO $OUTPUT | grep " version \""`
if test "x$FOUND_VERSION" != x && test "x$FOUND_WARN" = x; then
boot_jdk_jvmargs_small="$boot_jdk_jvmargs_small -XX:TieredStopAtLevel=1"
JVM_ARG_OK=true
else
$ECHO "Arg failed:" >&5
$ECHO "$OUTPUT" >&5
JVM_ARG_OK=false
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $boot_jdk_jvmargs_small" >&5 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $boot_jdk_jvmargs_small" >&5
$as_echo "$boot_jdk_jvmargs_small" >&6; } $as_echo "$boot_jdk_jvmargs_small" >&6; }

View File

@ -435,7 +435,7 @@ AC_DEFUN([PLATFORM_SETUP_LEGACY_VARS_HELPER],
HOTSPOT_$1_CPU_DEFINE=PPC32 HOTSPOT_$1_CPU_DEFINE=PPC32
elif test "x$OPENJDK_$1_CPU" = xs390; then elif test "x$OPENJDK_$1_CPU" = xs390; then
HOTSPOT_$1_CPU_DEFINE=S390 HOTSPOT_$1_CPU_DEFINE=S390
elif test "x$OPENJDK_$1_CPU" = ss390x; then elif test "x$OPENJDK_$1_CPU" = xs390x; then
HOTSPOT_$1_CPU_DEFINE=S390 HOTSPOT_$1_CPU_DEFINE=S390
fi fi
AC_SUBST(HOTSPOT_$1_CPU_DEFINE) AC_SUBST(HOTSPOT_$1_CPU_DEFINE)

View File

@ -212,14 +212,17 @@ var getJibProfiles = function (input) {
* @returns Common values * @returns Common values
*/ */
var getJibProfilesCommon = function (input) { var getJibProfilesCommon = function (input) {
var common = { var common = {};
dependencies: ["boot_jdk", "gnumake", "jtreg"],
configure_args: ["--with-default-make-target=all", "--enable-jtreg-failure-handler"], common.dependencies = ["boot_jdk", "gnumake", "jtreg"],
configure_args_32bit: ["--with-target-bits=32", "--with-jvm-variants=client,server"], common.default_make_targets = ["product-images", "test-image"],
configure_args_debug: ["--enable-debug"], common.default_make_targets_debug = common.default_make_targets;
configure_args_slowdebug: ["--with-debug-level=slowdebug"], common.default_make_targets_slowdebug = common.default_make_targets;
organization: "jpg.infra.builddeps" common.configure_args = ["--enable-jtreg-failure-handler"],
}; common.configure_args_32bit = ["--with-target-bits=32", "--with-jvm-variants=client,server"],
common.configure_args_debug = ["--enable-debug"],
common.configure_args_slowdebug = ["--with-debug-level=slowdebug"],
common.organization = "jpg.infra.builddeps"
return common; return common;
}; };
@ -242,7 +245,7 @@ var getJibProfilesProfiles = function (input, common) {
target_cpu: "x64", target_cpu: "x64",
dependencies: concat(common.dependencies, "devkit"), dependencies: concat(common.dependencies, "devkit"),
configure_args: concat(common.configure_args, "--with-zlib=system"), configure_args: concat(common.configure_args, "--with-zlib=system"),
make_args: common.make_args default_make_targets: concat(common.default_make_targets, "docs-image")
}, },
"linux-x86": { "linux-x86": {
@ -252,7 +255,7 @@ var getJibProfilesProfiles = function (input, common) {
dependencies: concat(common.dependencies, "devkit"), dependencies: concat(common.dependencies, "devkit"),
configure_args: concat(common.configure_args, common.configure_args_32bit, configure_args: concat(common.configure_args, common.configure_args_32bit,
"--with-zlib=system"), "--with-zlib=system"),
make_args: common.make_args default_make_targets: common.default_make_targets
}, },
"macosx-x64": { "macosx-x64": {
@ -260,7 +263,7 @@ var getJibProfilesProfiles = function (input, common) {
target_cpu: "x64", target_cpu: "x64",
dependencies: concat(common.dependencies, "devkit"), dependencies: concat(common.dependencies, "devkit"),
configure_args: concat(common.configure_args, "--with-zlib=system"), configure_args: concat(common.configure_args, "--with-zlib=system"),
make_args: common.make_args default_make_targets: common.default_make_targets
}, },
"solaris-x64": { "solaris-x64": {
@ -268,7 +271,7 @@ var getJibProfilesProfiles = function (input, common) {
target_cpu: "x64", target_cpu: "x64",
dependencies: concat(common.dependencies, "devkit", "cups"), dependencies: concat(common.dependencies, "devkit", "cups"),
configure_args: concat(common.configure_args, "--with-zlib=system"), configure_args: concat(common.configure_args, "--with-zlib=system"),
make_args: common.make_args default_make_targets: common.default_make_targets
}, },
"solaris-sparcv9": { "solaris-sparcv9": {
@ -276,15 +279,15 @@ var getJibProfilesProfiles = function (input, common) {
target_cpu: "sparcv9", target_cpu: "sparcv9",
dependencies: concat(common.dependencies, "devkit", "cups"), dependencies: concat(common.dependencies, "devkit", "cups"),
configure_args: concat(common.configure_args, "--with-zlib=system"), configure_args: concat(common.configure_args, "--with-zlib=system"),
make_args: common.make_args default_make_targets: common.default_make_targets
}, },
"windows-x64": { "windows-x64": {
target_os: "windows", target_os: "windows",
target_cpu: "x64", target_cpu: "x64",
dependencies: concat(common.dependencies, "devkit", "freetype"), dependencies: concat(common.dependencies, "devkit", "freetype"),
configure_args: common.configure_args, configure_args: concat(common.configure_args),
make_args: common.make_args default_make_targets: common.default_make_targets
}, },
"windows-x86": { "windows-x86": {
@ -293,7 +296,7 @@ var getJibProfilesProfiles = function (input, common) {
build_cpu: "x64", build_cpu: "x64",
dependencies: concat(common.dependencies, "devkit", "freetype"), dependencies: concat(common.dependencies, "devkit", "freetype"),
configure_args: concat(common.configure_args, common.configure_args_32bit), configure_args: concat(common.configure_args, common.configure_args_32bit),
make_args: common.make_args default_make_targets: common.default_make_targets
} }
}; };
profiles = concatObjects(profiles, mainProfiles); profiles = concatObjects(profiles, mainProfiles);
@ -306,14 +309,15 @@ var getJibProfilesProfiles = function (input, common) {
// implementation builds. // implementation builds.
var openOnlyProfiles = generateOpenOnlyProfiles(common, mainProfiles); var openOnlyProfiles = generateOpenOnlyProfiles(common, mainProfiles);
// The open only profiles on linux are used for reference builds and should // The open only profiles on linux are used for reference builds and should
// produce the compact profile images by default. // produce the compact profile images by default. This adds "profiles" as an
// extra default target.
var openOnlyProfilesExtra = { var openOnlyProfilesExtra = {
"linux-x64-open": { "linux-x64-open": {
configure_args: ["--with-default-make-target=all profiles"], default_make_targets: "profiles"
}, },
"linux-x86-open": { "linux-x86-open": {
configure_args: ["--with-default-make-target=all profiles"], default_make_targets: "profiles"
} }
}; };
var openOnlyProfiles = concatObjects(openOnlyProfiles, openOnlyProfilesExtra); var openOnlyProfiles = concatObjects(openOnlyProfiles, openOnlyProfilesExtra);
@ -336,6 +340,7 @@ var getJibProfilesProfiles = function (input, common) {
// Generate the missing platform attributes // Generate the missing platform attributes
profiles = generatePlatformAttributes(profiles); profiles = generatePlatformAttributes(profiles);
profiles = generateDefaultMakeTargetsConfigureArg(common, profiles);
return profiles; return profiles;
}; };
@ -469,6 +474,8 @@ var generateDebugProfiles = function (common, profiles) {
var debugProfile = profile + "-debug"; var debugProfile = profile + "-debug";
newProfiles[debugProfile] = clone(profiles[profile]); newProfiles[debugProfile] = clone(profiles[profile]);
newProfiles[debugProfile].debug_level = "fastdebug"; newProfiles[debugProfile].debug_level = "fastdebug";
newProfiles[debugProfile].default_make_targets
= common.default_make_targets_debug;
newProfiles[debugProfile].labels newProfiles[debugProfile].labels
= concat(newProfiles[debugProfile].labels || [], "debug"), = concat(newProfiles[debugProfile].labels || [], "debug"),
newProfiles[debugProfile].configure_args newProfiles[debugProfile].configure_args
@ -492,6 +499,8 @@ var generateSlowdebugProfiles = function (common, profiles) {
var debugProfile = profile + "-slowdebug"; var debugProfile = profile + "-slowdebug";
newProfiles[debugProfile] = clone(profiles[profile]); newProfiles[debugProfile] = clone(profiles[profile]);
newProfiles[debugProfile].debug_level = "slowdebug"; newProfiles[debugProfile].debug_level = "slowdebug";
newProfiles[debugProfile].default_make_targets
= common.default_make_targets_slowdebug;
newProfiles[debugProfile].labels newProfiles[debugProfile].labels
= concat(newProfiles[debugProfile].labels || [], "slowdebug"), = concat(newProfiles[debugProfile].labels || [], "slowdebug"),
newProfiles[debugProfile].configure_args newProfiles[debugProfile].configure_args
@ -523,6 +532,39 @@ var generateOpenOnlyProfiles = function (common, profiles) {
return newProfiles; return newProfiles;
}; };
/**
* The default_make_targets attribute on a profile is not a real Jib attribute.
* This function rewrites that attribute into the corresponding configure arg.
* Calling this function multiple times on the same profiles object is safe.
*
* @param common Common values
* @param profiles Profiles map to rewrite profiles for
* @returns {{}} New map of profiles with the make targets converted
*/
var generateDefaultMakeTargetsConfigureArg = function (common, profiles) {
var ret = concatObjects(profiles, {});
for (var profile in ret) {
if (ret[profile]["default_make_targets"] != null) {
var targetsString = concat(ret[profile].default_make_targets).join(" ");
// Iterate over all configure args and see if --with-default-make-target
// is already there and change it, otherwise add it.
var found = false;
for (var arg in ret[profile].configure_args) {
if (arg.startsWith("--with-default-make-target")) {
found = true;
arg.replace(/=.*/, "=" + targetsString);
}
}
if (!found) {
ret[profile].configure_args = concat(
ret[profile].configure_args,
"--with-default-make-target=" + targetsString);
}
}
}
return ret;
}
/** /**
* Deep clones an object tree. * Deep clones an object tree.
* *

View File

@ -358,3 +358,4 @@ b75afa17aefe480c23c616a6a2497063312f7189 jdk-9+109
cc30faa2da498c478e89ab062ff160653ca1b170 jdk-9+113 cc30faa2da498c478e89ab062ff160653ca1b170 jdk-9+113
10d175b0368c30f54350fc648adc41b94ce357ee jdk-9+114 10d175b0368c30f54350fc648adc41b94ce357ee jdk-9+114
7bab1b1b36824924b1c657a8419369ba93d198d3 jdk-9+115 7bab1b1b36824924b1c657a8419369ba93d198d3 jdk-9+115
7dfa7377a5e601b8f740741a9a80e04c72dd04d6 jdk-9+116

View File

@ -518,3 +518,4 @@ c558850fac5750d8ca98a45180121980f57cdd28 jdk-9+111
c569f8d89269fb6205b90f727581eb8cc04132f9 jdk-9+113 c569f8d89269fb6205b90f727581eb8cc04132f9 jdk-9+113
b64432bae5271735fd53300b2005b713e98ef411 jdk-9+114 b64432bae5271735fd53300b2005b713e98ef411 jdk-9+114
88dd08d7be0fe7fb9f1914b1628f0aae9bf56e25 jdk-9+115 88dd08d7be0fe7fb9f1914b1628f0aae9bf56e25 jdk-9+115
61a214186dae6811dd989e9165e42f7dbf02acde jdk-9+116

View File

@ -358,3 +358,4 @@ bdbf2342b21bd8ecad1b4e6499a0dfb314952bd7 jdk-9+103
28626780e245fccbfb9bad8e3b05f62357958038 jdk-9+113 28626780e245fccbfb9bad8e3b05f62357958038 jdk-9+113
147114dd0641cd7c9fe6e81642eb993a7b9c6f0b jdk-9+114 147114dd0641cd7c9fe6e81642eb993a7b9c6f0b jdk-9+114
1902a5bda18e794b31fc5f520f5e7d827714b50d jdk-9+115 1902a5bda18e794b31fc5f520f5e7d827714b50d jdk-9+115
9d71d20e614777cd23c1a43b38b5c08a9094d27a jdk-9+116

View File

@ -444,13 +444,15 @@ public class CatalogFeatures {
} }
} else if (index == Feature.FILES.ordinal()) { } else if (index == Feature.FILES.ordinal()) {
try { try {
if (Util.verifyAndGetURI(value, null) == null) { String[] catalogFile = value.split(";[ ]*");
for (String temp : catalogFile) {
if (Util.verifyAndGetURI(temp, null) == null) {
CatalogMessages.reportIAE(new Object[]{value, Feature.FILES.name()}, null); CatalogMessages.reportIAE(new Object[]{value, Feature.FILES.name()}, null);
} }
}
}catch (MalformedURLException | URISyntaxException | IllegalArgumentException ex) { }catch (MalformedURLException | URISyntaxException | IllegalArgumentException ex) {
CatalogMessages.reportIAE(new Object[]{value, Feature.FILES.name()}, ex); CatalogMessages.reportIAE(new Object[]{value, Feature.FILES.name()}, ex);
} }
} }
if (states[index] == null || state.compareTo(states[index]) >= 0) { if (states[index] == null || state.compareTo(states[index]) >= 0) {
values[index] = value; values[index] = value;

View File

@ -91,6 +91,7 @@ public class TestPolicy extends Policy {
permissions.add(new PropertyPermission("line.separator", "read")); permissions.add(new PropertyPermission("line.separator", "read"));
permissions.add(new PropertyPermission("fileStringBuffer", "read")); permissions.add(new PropertyPermission("fileStringBuffer", "read"));
permissions.add(new PropertyPermission("dataproviderthreadcount", "read")); permissions.add(new PropertyPermission("dataproviderthreadcount", "read"));
permissions.add(new RuntimePermission("charsetProvider"));
} }
/* /*

View File

@ -23,6 +23,7 @@
package catalog; package catalog;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Paths;
import javax.xml.catalog.Catalog; import javax.xml.catalog.Catalog;
import javax.xml.catalog.CatalogException; import javax.xml.catalog.CatalogException;
import javax.xml.catalog.CatalogFeatures; import javax.xml.catalog.CatalogFeatures;
@ -34,6 +35,7 @@ import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory; import javax.xml.parsers.SAXParserFactory;
import org.testng.Assert; import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider; import org.testng.annotations.DataProvider;
import org.testng.annotations.Test; import org.testng.annotations.Test;
import org.xml.sax.Attributes; import org.xml.sax.Attributes;
@ -44,10 +46,49 @@ import org.xml.sax.XMLReader;
import org.xml.sax.ext.DefaultHandler2; import org.xml.sax.ext.DefaultHandler2;
/* /*
* @bug 8081248, 8144966, 8146606, 8146237, 8151154, 8150969, 8151162, 8152527 * @bug 8081248, 8144966, 8146606, 8146237, 8151154, 8150969, 8151162, 8152527, 8154220
* @summary Tests basic Catalog functions. * @summary Tests basic Catalog functions.
*/ */
public class CatalogTest { public class CatalogTest {
static final String KEY_FILES = "javax.xml.catalog.files";
public String filepath;
/*
* Initializing fields
*/
@BeforeClass
public void setUpClass() throws Exception {
String file1 = getClass().getResource("first_cat.xml").getFile();
if (System.getProperty("os.name").contains("Windows")) {
filepath = file1.substring(1, file1.lastIndexOf("/") + 1);
} else {
filepath = file1.substring(0, file1.lastIndexOf("/") + 1);
}
}
/*
* @bug 8154220
* Verifies that the file input is validated properly. Valid input includes
* multiple file paths separated by semicolon.
*/
@Test(dataProvider = "hierarchyOfCatFilesData")
public void hierarchyOfCatFiles2(String systemId, String expectedUri) {
String file1 = getClass().getResource("first_cat.xml").getFile();
String file2 = getClass().getResource("second_cat.xml").getFile();
String files = file1 + ";" + file2;
try {
System.setProperty(KEY_FILES, files);
CatalogResolver catalogResolver = CatalogManager.catalogResolver(CatalogFeatures.defaults());
String sysId = catalogResolver.resolveEntity(null, systemId).getSystemId();
Assert.assertEquals(sysId, Paths.get(filepath + expectedUri).toUri().toString().replace("///", "/"), "System ID match not right");
} finally {
System.clearProperty(KEY_FILES);
}
}
/* /*
* @bug 8152527 * @bug 8152527
* This test is the same as the JDK test ResolveEntityTests:testMatch1. * This test is the same as the JDK test ResolveEntityTests:testMatch1.
@ -288,6 +329,19 @@ public class CatalogTest {
} }
} }
/*
DataProvider: used to verify hierarchical catalogs. Refer to JCK test
hierarchyOfCatFiles2.
*/
@DataProvider(name = "hierarchyOfCatFilesData")
Object[][] getHierarchyOfCatFilesData() {
return new Object[][]{
{"http://www.oracle.com/sequence.dtd", "first.dtd"},
{"http://www.oracle.com/sequence_next.dtd", "next.dtd"},
{"http://www.oracle.com/sequence_second.dtd", "second.dtd"}
};
}
/* /*
DataProvider: used to verify CatalogResolver's resolveEntity function. DataProvider: used to verify CatalogResolver's resolveEntity function.
Data columns: Data columns:
@ -300,6 +354,7 @@ public class CatalogTest {
{"rewriteSystem_id.xml", "system", "http://www.sys00test.com/rewrite.dtd", "PUB-404", expected, expected, "Relative rewriteSystem with xml:base at group level failed"}, {"rewriteSystem_id.xml", "system", "http://www.sys00test.com/rewrite.dtd", "PUB-404", expected, expected, "Relative rewriteSystem with xml:base at group level failed"},
}; };
} }
static String id = "http://openjdk.java.net/xml/catalog/dtd/system.dtd"; static String id = "http://openjdk.java.net/xml/catalog/dtd/system.dtd";
/* /*
DataProvider: used to verify how prefer settings affect the result of the DataProvider: used to verify how prefer settings affect the result of the

View File

@ -0,0 +1,6 @@
<catalog prefer="system" xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<system systemId="http://www.oracle.com/sequence.dtd" uri="first.dtd"/>
<nextCatalog catalog="next_cat.xml"/>
</catalog>

View File

@ -0,0 +1,6 @@
<catalog prefer="public" xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<system systemId="http://www.oracle.com/sequence.dtd" uri="next.dtd"/>
<system systemId="http://www.oracle.com/sequence_next.dtd" uri="next.dtd"/>
</catalog>

View File

@ -0,0 +1,7 @@
<catalog prefer="public" xmlns="urn:oasis:names:tc:entity:xmlns:xml:catalog">
<system systemId="http://www.oracle.com/sequence.dtd" uri="second.dtd"/>
<system systemId="http://www.oracle.com/sequence_next.dtd" uri="second.dtd"/>
<system systemId="http://www.oracle.com/sequence_second.dtd" uri="second.dtd"/>
</catalog>

View File

@ -361,3 +361,4 @@ fafd694e801f0f5a7c737fb08630ced3ca8f772c jdk-9+107
e980062475c10d21137051045bf95ee229db9b27 jdk-9+113 e980062475c10d21137051045bf95ee229db9b27 jdk-9+113
b314bb02182b9ca94708a91f312c377f5435f740 jdk-9+114 b314bb02182b9ca94708a91f312c377f5435f740 jdk-9+114
4ff86e5489e4c0513dadfa69def8601c110ca5cd jdk-9+115 4ff86e5489e4c0513dadfa69def8601c110ca5cd jdk-9+115
529f0bf896e58525614d863e283ad155531941cb jdk-9+116

View File

@ -96,7 +96,13 @@ TOOL_CHARSETMAPPING = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classe
TOOL_SPP = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes build.tools.spp.Spp TOOL_SPP = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes build.tools.spp.Spp
# Nimbus is used somewhere in the swing build. # Nimbus is used somewhere in the swing build.
ifeq ($(BOOT_JDK_MODULAR), true)
COMPILENIMBUS_ADD_MODS := -addmods java.xml.bind
endif
TOOL_GENERATENIMBUS = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \ TOOL_GENERATENIMBUS = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
$(COMPILENIMBUS_ADD_MODS) \
build.tools.generatenimbus.Generator build.tools.generatenimbus.Generator
TOOL_WRAPPERGENERATOR = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \ TOOL_WRAPPERGENERATOR = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \

View File

@ -1,5 +1,5 @@
# #
# Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. # Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
# #
# This code is free software; you can redistribute it and/or modify it # This code is free software; you can redistribute it and/or modify it
@ -41,7 +41,7 @@ include GendataPolicyJars.gmk
GENDATA_UNINAME := $(JDK_OUTPUTDIR)/modules/java.base/java/lang/uniName.dat GENDATA_UNINAME := $(JDK_OUTPUTDIR)/modules/java.base/java/lang/uniName.dat
$(GENDATA_UNINAME): $(JDK_TOPDIR)/make/data/unicodedata/UnicodeData.txt $(BUILD_TOOLS_JDK) $(GENDATA_UNINAME): $(JDK_TOPDIR)/make/data/unicodedata/UnicodeData.txt $(BUILD_TOOLS_JDK)
$(MKDIR) -p $(@D) $(call MakeDir, $(@D))
$(TOOL_CHARACTERNAME) $< $@ $(TOOL_CHARACTERNAME) $< $@
TARGETS += $(GENDATA_UNINAME) TARGETS += $(GENDATA_UNINAME)
@ -51,7 +51,7 @@ TARGETS += $(GENDATA_UNINAME)
GENDATA_CURDATA := $(JDK_OUTPUTDIR)/modules/java.base/java/util/currency.data GENDATA_CURDATA := $(JDK_OUTPUTDIR)/modules/java.base/java/util/currency.data
$(GENDATA_CURDATA): $(JDK_TOPDIR)/make/data/currency/CurrencyData.properties $(BUILD_TOOLS_JDK) $(GENDATA_CURDATA): $(JDK_TOPDIR)/make/data/currency/CurrencyData.properties $(BUILD_TOOLS_JDK)
$(MKDIR) -p $(@D) $(call MakeDir, $(@D))
$(RM) $@ $(RM) $@
$(TOOL_GENERATECURRENCYDATA) -o $@.tmp < $< $(TOOL_GENERATECURRENCYDATA) -o $@.tmp < $<
$(MV) $@.tmp $@ $(MV) $@.tmp $@
@ -67,10 +67,10 @@ GENDATA_JAVA_SECURITY := $(SUPPORT_OUTPUTDIR)/modules_conf/java.base/security/ja
# RESTRICTED_PKGS_SRC is optionally set in custom extension for this makefile # RESTRICTED_PKGS_SRC is optionally set in custom extension for this makefile
$(GENDATA_JAVA_SECURITY): $(BUILD_TOOLS) $(GENDATA_JAVA_SECURITY_SRC) $(RESTRICTED_PKGS_SRC) $(GENDATA_JAVA_SECURITY): $(BUILD_TOOLS) $(GENDATA_JAVA_SECURITY_SRC) $(RESTRICTED_PKGS_SRC)
$(ECHO) "Generating java.security" $(call LogInfo, Generating java.security)
$(MKDIR) -p $(@D) $(call MakeDir, $(@D))
$(TOOL_MAKEJAVASECURITY) $(GENDATA_JAVA_SECURITY_SRC) $@ $(OPENJDK_TARGET_OS) \ $(TOOL_MAKEJAVASECURITY) $(GENDATA_JAVA_SECURITY_SRC) $@ $(OPENJDK_TARGET_OS) \
$(OPENJDK_TARGET_CPU_ARCH) $(RESTRICTED_PKGS_SRC) || exit 1 $(OPENJDK_TARGET_CPU_ARCH) $(RESTRICTED_PKGS_SRC)
TARGETS += $(GENDATA_JAVA_SECURITY) TARGETS += $(GENDATA_JAVA_SECURITY)
@ -78,7 +78,7 @@ TARGETS += $(GENDATA_JAVA_SECURITY)
$(SUPPORT_OUTPUTDIR)/modules_libs/java.base/classlist: \ $(SUPPORT_OUTPUTDIR)/modules_libs/java.base/classlist: \
$(JDK_TOPDIR)/make/data/classlist/classlist.$(OPENJDK_TARGET_OS) $(JDK_TOPDIR)/make/data/classlist/classlist.$(OPENJDK_TARGET_OS)
$(MKDIR) -p $(@D) $(call MakeDir, $(@D))
$(RM) $@ $@.tmp $(RM) $@ $@.tmp
$(TOOL_ADDJSUM) $< $@.tmp $(TOOL_ADDJSUM) $< $@.tmp
$(MV) $@.tmp $@ $(MV) $@.tmp $@

View File

@ -62,10 +62,13 @@ $(eval $(call SetupJavaCompilation,BUILD_BREAKITERATOR_LD, \
BIN := $(BREAK_ITERATOR_CLASSES)/jdk.localedata)) BIN := $(BREAK_ITERATOR_CLASSES)/jdk.localedata))
ifeq ($(BOOT_JDK_MODULAR), true) ifeq ($(BOOT_JDK_MODULAR), true)
BREAK_ITERATOR_BOOTCLASSPATH := -Xpatch:$(BREAK_ITERATOR_CLASSES) \ BREAK_ITERATOR_BOOTCLASSPATH := \
-Xpatch:java.base=$(BREAK_ITERATOR_CLASSES)/java.base \
-Xpatch:jdk.localedata=$(BREAK_ITERATOR_CLASSES)/jdk.localedata \
-XaddExports:java.base/sun.text=ALL-UNNAMED \ -XaddExports:java.base/sun.text=ALL-UNNAMED \
-XaddExports:java.base/sun.text.resources=ALL-UNNAMED \ -XaddExports:java.base/sun.text.resources=ALL-UNNAMED \
-XaddExports:jdk.localedata/sun.text.resources.ext=ALL-UNNAMED -XaddExports:jdk.localedata/sun.text.resources.ext=ALL-UNNAMED \
#
else else
BREAK_ITERATOR_BOOTCLASSPATH := -Xbootclasspath/p:$(call PathList, \ BREAK_ITERATOR_BOOTCLASSPATH := -Xbootclasspath/p:$(call PathList, \
$(BREAK_ITERATOR_CLASSES)/java.base \ $(BREAK_ITERATOR_CLASSES)/java.base \

View File

@ -31,7 +31,7 @@ $(eval $(call IncludeCustomExtension, jdk, launcher/Launcher-java.desktop.gmk))
ifndef BUILD_HEADLESS_ONLY ifndef BUILD_HEADLESS_ONLY
$(eval $(call SetupBuildLauncher, appletviewer, \ $(eval $(call SetupBuildLauncher, appletviewer, \
MAIN_CLASS := sun.applet.Main, \ MAIN_CLASS := sun.applet.Main, \
JAVA_ARGS := -addmods ALL-SYSTEM, \ JAVA_ARGS := -addmods ALL-DEFAULT, \
LIBS_unix := $(X_LIBS), \ LIBS_unix := $(X_LIBS), \
)) ))
endif endif

View File

@ -27,4 +27,5 @@ include LauncherCommon.gmk
$(eval $(call SetupBuildLauncher, jrunscript, \ $(eval $(call SetupBuildLauncher, jrunscript, \
MAIN_CLASS := com.sun.tools.script.shell.Main, \ MAIN_CLASS := com.sun.tools.script.shell.Main, \
JAVA_ARGS := -addmods ALL-DEFAULT, \
)) ))

View File

@ -27,6 +27,7 @@ include LauncherCommon.gmk
$(eval $(call SetupBuildLauncher, javac, \ $(eval $(call SetupBuildLauncher, javac, \
MAIN_CLASS := com.sun.tools.javac.Main, \ MAIN_CLASS := com.sun.tools.javac.Main, \
JAVA_ARGS := -addmods ALL-DEFAULT, \
CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \ CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \
-DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
)) ))

View File

@ -27,6 +27,7 @@ include LauncherCommon.gmk
$(eval $(call SetupBuildLauncher, javadoc, \ $(eval $(call SetupBuildLauncher, javadoc, \
MAIN_CLASS := jdk.javadoc.internal.tool.Main, \ MAIN_CLASS := jdk.javadoc.internal.tool.Main, \
JAVA_ARGS := -addmods ALL-DEFAULT, \
CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \ CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS \
-DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \
)) ))

View File

@ -32,6 +32,7 @@ $(eval $(call SetupBuildLauncher, jimage,\
$(eval $(call SetupBuildLauncher, jlink,\ $(eval $(call SetupBuildLauncher, jlink,\
MAIN_CLASS := jdk.tools.jlink.internal.Main, \ MAIN_CLASS := jdk.tools.jlink.internal.Main, \
JAVA_ARGS := -addmods ALL-DEFAULT, \
CFLAGS := -DENABLE_ARG_FILES \ CFLAGS := -DENABLE_ARG_FILES \
-DEXPAND_CLASSPATH_WILDCARDS \ -DEXPAND_CLASSPATH_WILDCARDS \
-DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \ -DNEVER_ACT_AS_SERVER_CLASS_MACHINE, \

View File

@ -27,6 +27,6 @@ include LauncherCommon.gmk
$(eval $(call SetupBuildLauncher, jjs, \ $(eval $(call SetupBuildLauncher, jjs, \
MAIN_CLASS := jdk.nashorn.tools.jjs.Main, \ MAIN_CLASS := jdk.nashorn.tools.jjs.Main, \
JAVA_ARGS := -addmods ALL-SYSTEM, \ JAVA_ARGS := -addmods ALL-DEFAULT, \
CFLAGS := -DENABLE_ARG_FILES, \ CFLAGS := -DENABLE_ARG_FILES, \
)) ))

View File

@ -179,6 +179,7 @@ SUNWprivate_1.1 {
Java_sun_awt_UNIXToolkit_load_1gtk_1icon; Java_sun_awt_UNIXToolkit_load_1gtk_1icon;
Java_sun_awt_UNIXToolkit_nativeSync; Java_sun_awt_UNIXToolkit_nativeSync;
Java_sun_awt_UNIXToolkit_gtkCheckVersionImpl; Java_sun_awt_UNIXToolkit_gtkCheckVersionImpl;
Java_sun_awt_UNIXToolkit_get_1gtk_1version;
Java_java_awt_AWTEvent_initIDs; Java_java_awt_AWTEvent_initIDs;
Java_java_awt_event_InputEvent_initIDs; Java_java_awt_event_InputEvent_initIDs;
Java_java_awt_event_KeyEvent_initIDs; Java_java_awt_event_KeyEvent_initIDs;

View File

@ -54,13 +54,13 @@ class UIProperty extends UIDefault<String> {
return String.format(" d.put(\"%s%s\", \"%s\");\n", return String.format(" d.put(\"%s%s\", \"%s\");\n",
prefix, getName(), getValue()); prefix, getName(), getValue());
case INT: case INT:
return String.format(" d.put(\"%s%s\", new Integer(%s));\n", return String.format(" d.put(\"%s%s\", Integer.valueOf(%s));\n",
prefix, getName(), getValue()); prefix, getName(), getValue());
case FLOAT: case FLOAT:
return String.format(" d.put(\"%s%s\", new Float(%sf));\n", return String.format(" d.put(\"%s%s\", Float.valueOf(%sf));\n",
prefix, getName(), getValue()); prefix, getName(), getValue());
case DOUBLE: case DOUBLE:
return String.format(" d.put(\"%s%s\", new Double(%s));\n", return String.format(" d.put(\"%s%s\", Double.valueOf(%s));\n",
prefix, getName(), getValue()); prefix, getName(), getValue());
case COLOR: case COLOR:
return String.format(" addColor(d, \"%s%s\", %s);\n", return String.format(" addColor(d, \"%s%s\", %s);\n",

View File

@ -102,7 +102,7 @@ public class LinuxFileSystemProvider extends UnixFileSystemProvider {
@Override @Override
FileTypeDetector getFileTypeDetector() { FileTypeDetector getFileTypeDetector() {
String userHome = GetPropertyAction.getProperty("user.home"); String userHome = GetPropertyAction.privilegedGetProperty("user.home");
Path userMimeTypes = Paths.get(userHome, ".mime.types"); Path userMimeTypes = Paths.get(userHome, ".mime.types");
Path etcMimeTypes = Paths.get("/etc/mime.types"); Path etcMimeTypes = Paths.get("/etc/mime.types");

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -53,7 +53,7 @@ iepoll(int epfd, struct epoll_event *events, int numfds, jlong timeout)
start = t.tv_sec * 1000 + t.tv_usec / 1000; start = t.tv_sec * 1000 + t.tv_usec / 1000;
for (;;) { for (;;) {
int res = epoll_wait(epfd, events, numfds, timeout); int res = epoll_wait(epfd, events, numfds, remaining);
if (res < 0 && errno == EINTR) { if (res < 0 && errno == EINTR) {
if (remaining >= 0) { if (remaining >= 0) {
gettimeofday(&t, NULL); gettimeofday(&t, NULL);

View File

@ -84,7 +84,8 @@ class KQueueArrayWrapper {
static { static {
IOUtil.load(); IOUtil.load();
initStructSizes(); initStructSizes();
String datamodel = GetPropertyAction.getProperty("sun.arch.data.model"); String datamodel =
GetPropertyAction.privilegedGetProperty("sun.arch.data.model");
is64bit = "64".equals(datamodel); is64bit = "64".equals(datamodel);
} }

View File

@ -29,8 +29,6 @@ import java.nio.file.*;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.security.AccessController;
import sun.security.action.GetPropertyAction;
import static sun.nio.fs.MacOSXNativeDispatcher.*; import static sun.nio.fs.MacOSXNativeDispatcher.*;

View File

@ -46,8 +46,8 @@ public class MacOSXFileSystemProvider extends BsdFileSystemProvider {
@Override @Override
FileTypeDetector getFileTypeDetector() { FileTypeDetector getFileTypeDetector() {
Path userMimeTypes = Paths.get( Path userMimeTypes = Paths.get(GetPropertyAction
GetPropertyAction.getProperty("user.home"), ".mime.types"); .privilegedGetProperty("user.home"), ".mime.types");
return chain(new MimeTypesFileTypeDetector(userMimeTypes), return chain(new MimeTypesFileTypeDetector(userMimeTypes),
new UTIFileTypeDetector()); new UTIFileTypeDetector());

View File

@ -1896,7 +1896,7 @@ public class File
// temporary directory location // temporary directory location
private static final File tmpdir = new File( private static final File tmpdir = new File(
GetPropertyAction.getProperty("java.io.tmpdir")); GetPropertyAction.privilegedGetProperty("java.io.tmpdir"));
static File location() { static File location() {
return tmpdir; return tmpdir;
} }

View File

@ -470,7 +470,7 @@ public final class Class<T> implements java.io.Serializable,
* expression with an empty argument list. The class is initialized if it * expression with an empty argument list. The class is initialized if it
* has not already been initialized. * has not already been initialized.
* *
* <p>Note that this method propagates any exception thrown by the * @deprecated This method propagates any exception thrown by the
* nullary constructor, including a checked exception. Use of * nullary constructor, including a checked exception. Use of
* this method effectively bypasses the compile-time exception * this method effectively bypasses the compile-time exception
* checking that would otherwise be performed by the compiler. * checking that would otherwise be performed by the compiler.
@ -500,6 +500,7 @@ public final class Class<T> implements java.io.Serializable,
* of this class. * of this class.
*/ */
@CallerSensitive @CallerSensitive
@Deprecated(since="9")
public T newInstance() public T newInstance()
throws InstantiationException, IllegalAccessException throws InstantiationException, IllegalAccessException
{ {

View File

@ -2615,7 +2615,7 @@ public abstract class ClassLoader {
ServicesCatalog createOrGetServicesCatalog() { ServicesCatalog createOrGetServicesCatalog() {
ServicesCatalog catalog = servicesCatalog; ServicesCatalog catalog = servicesCatalog;
if (catalog == null) { if (catalog == null) {
catalog = new ServicesCatalog(); catalog = ServicesCatalog.create();
boolean set = trySetObjectField("servicesCatalog", catalog); boolean set = trySetObjectField("servicesCatalog", catalog);
if (!set) { if (!set) {
// beaten by someone else // beaten by someone else

View File

@ -468,7 +468,7 @@ public final class ProcessBuilder
*/ */
public abstract static class Redirect { public abstract static class Redirect {
private static final File NULL_FILE = new File( private static final File NULL_FILE = new File(
(GetPropertyAction.getProperty("os.name") (GetPropertyAction.privilegedGetProperty("os.name")
.startsWith("Windows") ? "NUL" : "/dev/null") .startsWith("Windows") ? "NUL" : "/dev/null")
); );

View File

@ -78,7 +78,8 @@ final class StackStreamFactory {
* Performance work and extensive testing is needed to replace the * Performance work and extensive testing is needed to replace the
* VM built-in backtrace filled in Throwable with the StackWalker. * VM built-in backtrace filled in Throwable with the StackWalker.
*/ */
final static boolean isDebug = getProperty("stackwalk.debug", false); final static boolean isDebug =
"true".equals(GetPropertyAction.privilegedGetProperty("stackwalk.debug"));
static <T> StackFrameTraverser<T> static <T> StackFrameTraverser<T>
makeStackTraverser(StackWalker walker, Function<? super Stream<StackFrame>, ? extends T> function) makeStackTraverser(StackWalker walker, Function<? super Stream<StackFrame>, ? extends T> function)
@ -988,11 +989,4 @@ final class StackStreamFactory {
c.getName().startsWith("java.lang.invoke.LambdaForm"); c.getName().startsWith("java.lang.invoke.LambdaForm");
} }
private static boolean getProperty(String key, boolean value) {
String s = GetPropertyAction.getProperty(key);
if (s != null) {
return Boolean.parseBoolean(s);
}
return value;
}
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1994, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -78,14 +78,8 @@ import jdk.internal.vm.annotation.Stable;
* <p> * <p>
* The Java language provides special support for the string * The Java language provides special support for the string
* concatenation operator (&nbsp;+&nbsp;), and for conversion of * concatenation operator (&nbsp;+&nbsp;), and for conversion of
* other objects to strings. String concatenation is implemented * other objects to strings. For additional information on string
* through the {@code StringBuilder}(or {@code StringBuffer}) * concatenation and conversion, see <i>The Java&trade; Language Specification</i>.
* class and its {@code append} method.
* String conversions are implemented through the method
* {@code toString}, defined by {@code Object} and
* inherited by all classes in Java. For additional information on
* string concatenation and conversion, see Gosling, Joy, and Steele,
* <i>The Java Language Specification</i>.
* *
* <p> Unless otherwise noted, passing a {@code null} argument to a constructor * <p> Unless otherwise noted, passing a {@code null} argument to a constructor
* or method in this class will cause a {@link NullPointerException} to be * or method in this class will cause a {@link NullPointerException} to be
@ -106,6 +100,14 @@ import jdk.internal.vm.annotation.Stable;
* into account. The {@link java.text.Collator} class provides methods for * into account. The {@link java.text.Collator} class provides methods for
* finer-grain, locale-sensitive String comparison. * finer-grain, locale-sensitive String comparison.
* *
* @implNote The implementation of the string concatenation operator is left to
* the discretion of a Java compiler, as long as the compiler ultimately conforms
* to <i>The Java&trade; Language Specification</i>. For example, the {@code javac} compiler
* may implement the operator with {@code StringBuffer}, {@code StringBuilder},
* or {@code java.lang.invoke.StringConcatFactory} depending on the JDK version. The
* implementation of string conversion is typically through the method {@code toString},
* defined by {@code Object} and inherited by all classes in Java.
*
* @author Lee Boynton * @author Lee Boynton
* @author Arthur van Hoff * @author Arthur van Hoff
* @author Martin Buchholz * @author Martin Buchholz
@ -115,6 +117,7 @@ import jdk.internal.vm.annotation.Stable;
* @see java.lang.StringBuilder * @see java.lang.StringBuilder
* @see java.nio.charset.Charset * @see java.nio.charset.Charset
* @since 1.0 * @since 1.0
* @jls 15.18.1 String Concatenation Operator +
*/ */
public final class String public final class String
@ -2977,6 +2980,7 @@ public final class String
* *
* @return a string that has the same contents as this string, but is * @return a string that has the same contents as this string, but is
* guaranteed to be from a pool of unique strings. * guaranteed to be from a pool of unique strings.
* @jls 3.10.5 String Literals
*/ */
public native String intern(); public native String intern();

View File

@ -69,7 +69,6 @@ import jdk.internal.logger.LazyLoggers;
import jdk.internal.logger.LocalizedLoggerWrapper; import jdk.internal.logger.LocalizedLoggerWrapper;
import jdk.internal.module.ModuleBootstrap; import jdk.internal.module.ModuleBootstrap;
import jdk.internal.module.Modules;
import jdk.internal.module.ServicesCatalog; import jdk.internal.module.ServicesCatalog;
/** /**
@ -1924,10 +1923,6 @@ public final class System {
// initialize the module system // initialize the module system
System.bootLayer = ModuleBootstrap.boot(); System.bootLayer = ModuleBootstrap.boot();
// base module needs to be loose (CODETOOLS-7901619)
Module base = Object.class.getModule();
Modules.addReads(base, null);
// module system initialized // module system initialized
VM.initLevel(2); VM.initLevel(2);
} }

View File

@ -88,7 +88,7 @@ import static jdk.internal.org.objectweb.asm.Opcodes.*;
static { static {
final String key = "jdk.internal.lambda.dumpProxyClasses"; final String key = "jdk.internal.lambda.dumpProxyClasses";
String path = GetPropertyAction.getProperty(key); String path = GetPropertyAction.privilegedGetProperty(key);
dumper = (null == path) ? null : ProxyClassesDumper.getInstance(path); dumper = (null == path) ? null : ProxyClassesDumper.getInstance(path);
} }

View File

@ -53,7 +53,7 @@ import sun.security.action.GetPropertyAction;
static final boolean VAR_HANDLE_GUARDS; static final boolean VAR_HANDLE_GUARDS;
static { static {
Properties props = GetPropertyAction.getProperties(); Properties props = GetPropertyAction.privilegedGetProperties();
DEBUG_METHOD_HANDLE_NAMES = Boolean.parseBoolean( DEBUG_METHOD_HANDLE_NAMES = Boolean.parseBoolean(
props.getProperty("java.lang.invoke.MethodHandle.DEBUG_NAMES")); props.getProperty("java.lang.invoke.MethodHandle.DEBUG_NAMES"));
DUMP_CLASS_FILES = Boolean.parseBoolean( DUMP_CLASS_FILES = Boolean.parseBoolean(

View File

@ -123,7 +123,7 @@ public final class StringConcatFactory {
* Concatenation strategy to use. See {@link Strategy} for possible options. * Concatenation strategy to use. See {@link Strategy} for possible options.
* This option is controllable with -Djava.lang.invoke.stringConcat JDK option. * This option is controllable with -Djava.lang.invoke.stringConcat JDK option.
*/ */
private static final Strategy STRATEGY; private static Strategy STRATEGY;
/** /**
* Default strategy to use for concatenation. * Default strategy to use for concatenation.
@ -187,7 +187,17 @@ public final class StringConcatFactory {
private static final ProxyClassesDumper DUMPER; private static final ProxyClassesDumper DUMPER;
static { static {
Properties props = GetPropertyAction.getProperties(); // In case we need to double-back onto the StringConcatFactory during this
// static initialization, make sure we have the reasonable defaults to complete
// the static initialization properly. After that, actual users would use the
// the proper values we have read from the the properties.
STRATEGY = DEFAULT_STRATEGY;
// CACHE_ENABLE = false; // implied
// CACHE = null; // implied
// DEBUG = false; // implied
// DUMPER = null; // implied
Properties props = GetPropertyAction.privilegedGetProperties();
final String strategy = final String strategy =
props.getProperty("java.lang.invoke.stringConcat"); props.getProperty("java.lang.invoke.stringConcat");
CACHE_ENABLE = Boolean.parseBoolean( CACHE_ENABLE = Boolean.parseBoolean(

View File

@ -136,6 +136,7 @@ import static java.lang.invoke.MethodHandleStatics.newInternalError;
* consists of the methods * consists of the methods
* {@link #compareAndSet compareAndSet}, * {@link #compareAndSet compareAndSet},
* {@link #weakCompareAndSet weakCompareAndSet}, * {@link #weakCompareAndSet weakCompareAndSet},
* {@link #weakCompareAndSetVolatile weakCompareAndSetVolatile},
* {@link #weakCompareAndSetAcquire weakCompareAndSetAcquire}, * {@link #weakCompareAndSetAcquire weakCompareAndSetAcquire},
* {@link #weakCompareAndSetRelease weakCompareAndSetRelease}, * {@link #weakCompareAndSetRelease weakCompareAndSetRelease},
* {@link #compareAndExchangeAcquire compareAndExchangeAcquire}, * {@link #compareAndExchangeAcquire compareAndExchangeAcquire},
@ -458,7 +459,7 @@ public abstract class VarHandle {
* *
* <p>The symbolic type descriptor at the call site of {@code get} * <p>The symbolic type descriptor at the call site of {@code get}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.get)} on this VarHandle. * {@code accessModeType(VarHandle.AccessMode.GET)} on this VarHandle.
* *
* <p>This access mode is supported by all VarHandle instances and never * <p>This access mode is supported by all VarHandle instances and never
* throws {@code UnsupportedOperationException}. * throws {@code UnsupportedOperationException}.
@ -488,7 +489,7 @@ public abstract class VarHandle {
* *
* <p>The symbolic type descriptor at the call site of {@code set} * <p>The symbolic type descriptor at the call site of {@code set}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.set)} on this VarHandle. * {@code accessModeType(VarHandle.AccessMode.SET)} on this VarHandle.
* *
* @param args the signature-polymorphic parameter list of the form * @param args the signature-polymorphic parameter list of the form
* {@code (CT, T newValue)} * {@code (CT, T newValue)}
@ -516,7 +517,8 @@ public abstract class VarHandle {
* *
* <p>The symbolic type descriptor at the call site of {@code getVolatile} * <p>The symbolic type descriptor at the call site of {@code getVolatile}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.getVolatile)} on this VarHandle. * {@code accessModeType(VarHandle.AccessMode.GET_VOLATILE)} on this
* VarHandle.
* *
* @param args the signature-polymorphic parameter list of the form * @param args the signature-polymorphic parameter list of the form
* {@code (CT)} * {@code (CT)}
@ -544,7 +546,8 @@ public abstract class VarHandle {
* *
* <p>The symbolic type descriptor at the call site of {@code setVolatile} * <p>The symbolic type descriptor at the call site of {@code setVolatile}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.setVolatile)} on this VarHandle. * {@code accessModeType(VarHandle.AccessMode.SET_VOLATILE)} on this
* VarHandle.
* *
* @apiNote * @apiNote
* Ignoring the many semantic differences from C and C++, this method has * Ignoring the many semantic differences from C and C++, this method has
@ -574,7 +577,8 @@ public abstract class VarHandle {
* *
* <p>The symbolic type descriptor at the call site of {@code getOpaque} * <p>The symbolic type descriptor at the call site of {@code getOpaque}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.getOpaque)} on this VarHandle. * {@code accessModeType(VarHandle.AccessMode.GET_OPAQUE)} on this
* VarHandle.
* *
* @param args the signature-polymorphic parameter list of the form * @param args the signature-polymorphic parameter list of the form
* {@code (CT)} * {@code (CT)}
@ -603,7 +607,8 @@ public abstract class VarHandle {
* *
* <p>The symbolic type descriptor at the call site of {@code setOpaque} * <p>The symbolic type descriptor at the call site of {@code setOpaque}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.setOpaque)} on this VarHandle. * {@code accessModeType(VarHandle.AccessMode.SET_OPAQUE)} on this
* VarHandle.
* *
* @param args the signature-polymorphic parameter list of the form * @param args the signature-polymorphic parameter list of the form
* {@code (CT, T newValue)} * {@code (CT, T newValue)}
@ -631,7 +636,8 @@ public abstract class VarHandle {
* *
* <p>The symbolic type descriptor at the call site of {@code getAcquire} * <p>The symbolic type descriptor at the call site of {@code getAcquire}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.getAcquire)} on this VarHandle. * {@code accessModeType(VarHandle.AccessMode.GET_ACQUIRE)} on this
* VarHandle.
* *
* @apiNote * @apiNote
* Ignoring the many semantic differences from C and C++, this method has * Ignoring the many semantic differences from C and C++, this method has
@ -664,7 +670,8 @@ public abstract class VarHandle {
* *
* <p>The symbolic type descriptor at the call site of {@code setRelease} * <p>The symbolic type descriptor at the call site of {@code setRelease}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.setRelease)} on this VarHandle. * {@code accessModeType(VarHandle.AccessMode.SET_RELEASE)} on this
* VarHandle.
* *
* @apiNote * @apiNote
* Ignoring the many semantic differences from C and C++, this method has * Ignoring the many semantic differences from C and C++, this method has
@ -700,7 +707,7 @@ public abstract class VarHandle {
* *
* <p>The symbolic type descriptor at the call site of {@code * <p>The symbolic type descriptor at the call site of {@code
* compareAndSet} must match the access mode type that is the result of * compareAndSet} must match the access mode type that is the result of
* calling {@code accessModeType(VarHandle.AccessMode.compareAndSet)} on * calling {@code accessModeType(VarHandle.AccessMode.COMPARE_AND_SET)} on
* this VarHandle. * this VarHandle.
* *
* @param args the signature-polymorphic parameter list of the form * @param args the signature-polymorphic parameter list of the form
@ -734,7 +741,7 @@ public abstract class VarHandle {
* <p>The symbolic type descriptor at the call site of {@code * <p>The symbolic type descriptor at the call site of {@code
* compareAndExchangeVolatile} * compareAndExchangeVolatile}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.compareAndExchangeVolatile)} * {@code accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_VOLATILE)}
* on this VarHandle. * on this VarHandle.
* *
* @param args the signature-polymorphic parameter list of the form * @param args the signature-polymorphic parameter list of the form
@ -769,7 +776,7 @@ public abstract class VarHandle {
* <p>The symbolic type descriptor at the call site of {@code * <p>The symbolic type descriptor at the call site of {@code
* compareAndExchangeAcquire} * compareAndExchangeAcquire}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.compareAndExchangeAcquire)} on * {@code accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_ACQUIRE)} on
* this VarHandle. * this VarHandle.
* *
* @param args the signature-polymorphic parameter list of the form * @param args the signature-polymorphic parameter list of the form
@ -804,7 +811,8 @@ public abstract class VarHandle {
* <p>The symbolic type descriptor at the call site of {@code * <p>The symbolic type descriptor at the call site of {@code
* compareAndExchangeRelease} * compareAndExchangeRelease}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.compareAndExchangeRelease)} on this VarHandle. * {@code accessModeType(VarHandle.AccessMode.COMPARE_AND_EXCHANGE_RELEASE)}
* on this VarHandle.
* *
* @param args the signature-polymorphic parameter list of the form * @param args the signature-polymorphic parameter list of the form
* {@code (CT, T expectedValue, T newValue)} * {@code (CT, T expectedValue, T newValue)}
@ -836,14 +844,14 @@ public abstract class VarHandle {
* {@link #get}. * {@link #get}.
* *
* <p>This operation may fail spuriously (typically, due to memory * <p>This operation may fail spuriously (typically, due to memory
* contention) even if the current value does match the expected value. * contention) even if the witness value does match the expected value.
* *
* <p>The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}. * <p>The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}.
* *
* <p>The symbolic type descriptor at the call site of {@code * <p>The symbolic type descriptor at the call site of {@code
* weakCompareAndSet} must match the access mode type that is the result of * weakCompareAndSet} must match the access mode type that is the result of
* calling {@code accessModeType(VarHandle.AccessMode.weakCompareAndSet)} on * calling {@code accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)}
* this VarHandle. * on this VarHandle.
* *
* @param args the signature-polymorphic parameter list of the form * @param args the signature-polymorphic parameter list of the form
* {@code (CT, T expectedValue, T newValue)} * {@code (CT, T expectedValue, T newValue)}
@ -865,6 +873,43 @@ public abstract class VarHandle {
@HotSpotIntrinsicCandidate @HotSpotIntrinsicCandidate
boolean weakCompareAndSet(Object... args); boolean weakCompareAndSet(Object... args);
/**
* Possibly atomically sets the value of a variable to the {@code newValue}
* with the memory semantics of {@link #setVolatile} if the variable's
* current value, referred to as the <em>witness value</em>, {@code ==} the
* {@code expectedValue}, as accessed with the memory semantics of
* {@link #getVolatile}.
*
* <p>This operation may fail spuriously (typically, due to memory
* contention) even if the witness value does match the expected value.
*
* <p>The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}.
*
* <p>The symbolic type descriptor at the call site of {@code
* weakCompareAndSetVolatile} must match the access mode type that is the
* result of calling {@code accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_VOLATILE)}
* on this VarHandle.
*
* @param args the signature-polymorphic parameter list of the form
* {@code (CT, T expectedValue, T newValue)}
* , statically represented using varargs.
* @return {@code true} if successful, otherwise {@code false} if the
* witness value was not the same as the {@code expectedValue} or if this
* operation spuriously failed.
* @throws UnsupportedOperationException if the access mode is unsupported
* for this VarHandle.
* @throws WrongMethodTypeException if the access mode type is not
* compatible with the caller's symbolic type descriptor.
* @throws ClassCastException if the access mode type is compatible with the
* caller's symbolic type descriptor, but a reference cast fails.
* @see #setVolatile(Object...)
* @see #getVolatile(Object...)
*/
public final native
@MethodHandle.PolymorphicSignature
@HotSpotIntrinsicCandidate
boolean weakCompareAndSetVolatile(Object... args);
/** /**
* Possibly atomically sets the value of a variable to the {@code newValue} * Possibly atomically sets the value of a variable to the {@code newValue}
* with the semantics of {@link #set} if the variable's current value, * with the semantics of {@link #set} if the variable's current value,
@ -873,14 +918,15 @@ public abstract class VarHandle {
* {@link #getAcquire}. * {@link #getAcquire}.
* *
* <p>This operation may fail spuriously (typically, due to memory * <p>This operation may fail spuriously (typically, due to memory
* contention) even if the current value does match the expected value. * contention) even if the witness value does match the expected value.
* *
* <p>The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}. * <p>The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}.
* *
* <p>The symbolic type descriptor at the call site of {@code * <p>The symbolic type descriptor at the call site of {@code
* weakCompareAndSetAcquire} * weakCompareAndSetAcquire}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.weakCompareAndSetAcquire)} on this VarHandle. * {@code accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)}
* on this VarHandle.
* *
* @param args the signature-polymorphic parameter list of the form * @param args the signature-polymorphic parameter list of the form
* {@code (CT, T expectedValue, T newValue)} * {@code (CT, T expectedValue, T newValue)}
@ -910,14 +956,15 @@ public abstract class VarHandle {
* {@link #get}. * {@link #get}.
* *
* <p>This operation may fail spuriously (typically, due to memory * <p>This operation may fail spuriously (typically, due to memory
* contention) even if the current value does match the expected value. * contention) even if the witness value does match the expected value.
* *
* <p>The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}. * <p>The method signature is of the form {@code (CT, T expectedValue, T newValue)boolean}.
* *
* <p>The symbolic type descriptor at the call site of {@code * <p>The symbolic type descriptor at the call site of {@code
* weakCompareAndSetRelease} * weakCompareAndSetRelease}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.weakCompareAndSetRelease)} on this VarHandle. * {@code accessModeType(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)}
* on this VarHandle.
* *
* @param args the signature-polymorphic parameter list of the form * @param args the signature-polymorphic parameter list of the form
* {@code (CT, T expectedValue, T newValue)} * {@code (CT, T expectedValue, T newValue)}
@ -949,7 +996,8 @@ public abstract class VarHandle {
* *
* <p>The symbolic type descriptor at the call site of {@code getAndSet} * <p>The symbolic type descriptor at the call site of {@code getAndSet}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.getAndSet)} on this VarHandle. * {@code accessModeType(VarHandle.AccessMode.GET_AND_SET)} on this
* VarHandle.
* *
* @param args the signature-polymorphic parameter list of the form * @param args the signature-polymorphic parameter list of the form
* {@code (CT, T newValue)} * {@code (CT, T newValue)}
@ -985,7 +1033,8 @@ public abstract class VarHandle {
* *
* <p>The symbolic type descriptor at the call site of {@code getAndAdd} * <p>The symbolic type descriptor at the call site of {@code getAndAdd}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.getAndAdd)} on this VarHandle. * {@code accessModeType(VarHandle.AccessMode.GET_AND_ADD)} on this
* VarHandle.
* *
* @param args the signature-polymorphic parameter list of the form * @param args the signature-polymorphic parameter list of the form
* {@code (CT, T value)} * {@code (CT, T value)}
@ -1017,7 +1066,8 @@ public abstract class VarHandle {
* *
* <p>The symbolic type descriptor at the call site of {@code addAndGet} * <p>The symbolic type descriptor at the call site of {@code addAndGet}
* must match the access mode type that is the result of calling * must match the access mode type that is the result of calling
* {@code accessModeType(VarHandle.AccessMode.addAndGet)} on this VarHandle. * {@code accessModeType(VarHandle.AccessMode.ADD_AND_GET)} on this
* VarHandle.
* *
* @param args the signature-polymorphic parameter list of the form * @param args the signature-polymorphic parameter list of the form
* {@code (CT, T value)} * {@code (CT, T value)}
@ -1083,109 +1133,115 @@ public abstract class VarHandle {
* method * method
* {@link VarHandle#get VarHandle.get} * {@link VarHandle#get VarHandle.get}
*/ */
GET("get", AccessType.GET, Object.class), // 0 GET("get", AccessType.GET, Object.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#set VarHandle.set} * {@link VarHandle#set VarHandle.set}
*/ */
SET("set", AccessType.SET, void.class), // 1 SET("set", AccessType.SET, void.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#getVolatile VarHandle.getVolatile} * {@link VarHandle#getVolatile VarHandle.getVolatile}
*/ */
GET_VOLATILE("getVolatile", AccessType.GET, Object.class), // 2 GET_VOLATILE("getVolatile", AccessType.GET, Object.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#setVolatile VarHandle.setVolatile} * {@link VarHandle#setVolatile VarHandle.setVolatile}
*/ */
SET_VOLATILE("setVolatile", AccessType.SET, void.class), // 3 SET_VOLATILE("setVolatile", AccessType.SET, void.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#getAcquire VarHandle.getAcquire} * {@link VarHandle#getAcquire VarHandle.getAcquire}
*/ */
GET_ACQUIRE("getAcquire", AccessType.GET, Object.class), // 4 GET_ACQUIRE("getAcquire", AccessType.GET, Object.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#setRelease VarHandle.setRelease} * {@link VarHandle#setRelease VarHandle.setRelease}
*/ */
SET_RELEASE("setRelease", AccessType.SET, void.class), // 5 SET_RELEASE("setRelease", AccessType.SET, void.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#getOpaque VarHandle.getOpaque} * {@link VarHandle#getOpaque VarHandle.getOpaque}
*/ */
GET_OPAQUE("getOpaque", AccessType.GET, Object.class), // 6 GET_OPAQUE("getOpaque", AccessType.GET, Object.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#setOpaque VarHandle.setOpaque} * {@link VarHandle#setOpaque VarHandle.setOpaque}
*/ */
SET_OPAQUE("setOpaque", AccessType.SET, void.class), // 7 SET_OPAQUE("setOpaque", AccessType.SET, void.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#compareAndSet VarHandle.compareAndSet} * {@link VarHandle#compareAndSet VarHandle.compareAndSet}
*/ */
COMPARE_AND_SET("compareAndSet", AccessType.COMPARE_AND_SWAP, boolean.class), // 8 COMPARE_AND_SET("compareAndSet", AccessType.COMPARE_AND_SWAP, boolean.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#compareAndExchangeVolatile VarHandle.compareAndExchangeVolatile} * {@link VarHandle#compareAndExchangeVolatile VarHandle.compareAndExchangeVolatile}
*/ */
COMPARE_AND_EXCHANGE_VOLATILE("compareAndExchangeVolatile", AccessType.COMPARE_AND_EXCHANGE, Object.class), // 9 COMPARE_AND_EXCHANGE_VOLATILE("compareAndExchangeVolatile", AccessType.COMPARE_AND_EXCHANGE, Object.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#compareAndExchangeAcquire VarHandle.compareAndExchangeAcquire} * {@link VarHandle#compareAndExchangeAcquire VarHandle.compareAndExchangeAcquire}
*/ */
COMPARE_AND_EXCHANGE_ACQUIRE("compareAndExchangeAcquire", AccessType.COMPARE_AND_EXCHANGE, Object.class), // 10 COMPARE_AND_EXCHANGE_ACQUIRE("compareAndExchangeAcquire", AccessType.COMPARE_AND_EXCHANGE, Object.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#compareAndExchangeRelease VarHandle.compareAndExchangeRelease} * {@link VarHandle#compareAndExchangeRelease VarHandle.compareAndExchangeRelease}
*/ */
COMPARE_AND_EXCHANGE_RELEASE("compareAndExchangeRelease", AccessType.COMPARE_AND_EXCHANGE, Object.class), // 11 COMPARE_AND_EXCHANGE_RELEASE("compareAndExchangeRelease", AccessType.COMPARE_AND_EXCHANGE, Object.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#weakCompareAndSet VarHandle.weakCompareAndSet} * {@link VarHandle#weakCompareAndSet VarHandle.weakCompareAndSet}
*/ */
WEAK_COMPARE_AND_SET("weakCompareAndSet", AccessType.COMPARE_AND_SWAP, boolean.class), // 12 WEAK_COMPARE_AND_SET("weakCompareAndSet", AccessType.COMPARE_AND_SWAP, boolean.class),
/**
* The access mode whose access is specified by the corresponding
* method
* {@link VarHandle#weakCompareAndSetVolatile VarHandle.weakCompareAndSetVolatile}
*/
WEAK_COMPARE_AND_SET_VOLATILE("weakCompareAndSetVolatile", AccessType.COMPARE_AND_SWAP, boolean.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#weakCompareAndSetAcquire VarHandle.weakCompareAndSetAcquire} * {@link VarHandle#weakCompareAndSetAcquire VarHandle.weakCompareAndSetAcquire}
*/ */
WEAK_COMPARE_AND_SET_ACQUIRE("weakCompareAndSetAcquire", AccessType.COMPARE_AND_SWAP, boolean.class), // 13 WEAK_COMPARE_AND_SET_ACQUIRE("weakCompareAndSetAcquire", AccessType.COMPARE_AND_SWAP, boolean.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#weakCompareAndSetRelease VarHandle.weakCompareAndSetRelease} * {@link VarHandle#weakCompareAndSetRelease VarHandle.weakCompareAndSetRelease}
*/ */
WEAK_COMPARE_AND_SET_RELEASE("weakCompareAndSetRelease", AccessType.COMPARE_AND_SWAP, boolean.class), // 14 WEAK_COMPARE_AND_SET_RELEASE("weakCompareAndSetRelease", AccessType.COMPARE_AND_SWAP, boolean.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#getAndSet VarHandle.getAndSet} * {@link VarHandle#getAndSet VarHandle.getAndSet}
*/ */
GET_AND_SET("getAndSet", AccessType.GET_AND_UPDATE, Object.class), // 15 GET_AND_SET("getAndSet", AccessType.GET_AND_UPDATE, Object.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#getAndAdd VarHandle.getAndAdd} * {@link VarHandle#getAndAdd VarHandle.getAndAdd}
*/ */
GET_AND_ADD("getAndAdd", AccessType.GET_AND_UPDATE, Object.class), // 16 GET_AND_ADD("getAndAdd", AccessType.GET_AND_UPDATE, Object.class),
/** /**
* The access mode whose access is specified by the corresponding * The access mode whose access is specified by the corresponding
* method * method
* {@link VarHandle#addAndGet VarHandle.addAndGet} * {@link VarHandle#addAndGet VarHandle.addAndGet}
*/ */
ADD_AND_GET("addAndGet", AccessType.GET_AND_UPDATE, Object.class), // 17 ADD_AND_GET("addAndGet", AccessType.GET_AND_UPDATE, Object.class),
; ;
static final Map<String, AccessMode> methodNameToAccessMode; static final Map<String, AccessMode> methodNameToAccessMode;

View File

@ -154,6 +154,15 @@ final class VarHandle$Type$s {
{#if[Object]?handle.fieldType.cast(value):value}); {#if[Object]?handle.fieldType.cast(value):value});
} }
@ForceInline
static boolean weakCompareAndSetVolatile(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
// TODO defer to strong form until new Unsafe method is added
return UNSAFE.compareAndSwap$Type$(Objects.requireNonNull(handle.receiverType.cast(holder)),
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
{#if[Object]?handle.fieldType.cast(value):value});
}
@ForceInline @ForceInline
static boolean weakCompareAndSetAcquire(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) { static boolean weakCompareAndSetAcquire(FieldInstanceReadWrite handle, Object holder, $type$ expected, $type$ value) {
return UNSAFE.weakCompareAndSwap$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)), return UNSAFE.weakCompareAndSwap$Type$Acquire(Objects.requireNonNull(handle.receiverType.cast(holder)),
@ -318,6 +327,15 @@ final class VarHandle$Type$s {
{#if[Object]?handle.fieldType.cast(value):value}); {#if[Object]?handle.fieldType.cast(value):value});
} }
@ForceInline
static boolean weakCompareAndSetVolatile(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
// TODO defer to strong form until new Unsafe method is added
return UNSAFE.compareAndSwap$Type$(handle.base,
handle.fieldOffset,
{#if[Object]?handle.fieldType.cast(expected):expected},
{#if[Object]?handle.fieldType.cast(value):value});
}
@ForceInline @ForceInline
static boolean weakCompareAndSetAcquire(FieldStaticReadWrite handle, $type$ expected, $type$ value) { static boolean weakCompareAndSetAcquire(FieldStaticReadWrite handle, $type$ expected, $type$ value) {
return UNSAFE.weakCompareAndSwap$Type$Acquire(handle.base, return UNSAFE.weakCompareAndSwap$Type$Acquire(handle.base,
@ -534,6 +552,20 @@ final class VarHandle$Type$s {
{#if[Object]?handle.componentType.cast(value):value}); {#if[Object]?handle.componentType.cast(value):value});
} }
@ForceInline
static boolean weakCompareAndSetVolatile(Array handle, Object oarray, int index, $type$ expected, $type$ value) {
#if[Object]
Object[] array = (Object[]) handle.arrayType.cast(oarray);
#else[Object]
$type$[] array = ($type$[]) oarray;
#end[Object]
// TODO defer to strong form until new Unsafe method is added
return UNSAFE.compareAndSwap$Type$(array,
(((long) Objects.checkIndex(index, array.length, AIOOBE_SUPPLIER)) << handle.ashift) + handle.abase,
{#if[Object]?handle.componentType.cast(expected):expected},
{#if[Object]?handle.componentType.cast(value):value});
}
@ForceInline @ForceInline
static boolean weakCompareAndSetAcquire(Array handle, Object oarray, int index, $type$ expected, $type$ value) { static boolean weakCompareAndSetAcquire(Array handle, Object oarray, int index, $type$ expected, $type$ value) {
#if[Object] #if[Object]

View File

@ -227,6 +227,16 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase {
convEndian(handle.be, expected), convEndian(handle.be, value)); convEndian(handle.be, expected), convEndian(handle.be, value));
} }
@ForceInline
static boolean weakCompareAndSetVolatile(ArrayHandle handle, Object oba, int index, $type$ expected, $type$ value) {
byte[] ba = (byte[]) oba;
// TODO defer to strong form until new Unsafe method is added
return UNSAFE.compareAndSwap$RawType$(
ba,
address(ba, index(ba, index)),
convEndian(handle.be, expected), convEndian(handle.be, value));
}
@ForceInline @ForceInline
static boolean weakCompareAndSetAcquire(ArrayHandle handle, Object oba, int index, $type$ expected, $type$ value) { static boolean weakCompareAndSetAcquire(ArrayHandle handle, Object oba, int index, $type$ expected, $type$ value) {
byte[] ba = (byte[]) oba; byte[] ba = (byte[]) oba;
@ -443,6 +453,16 @@ final class VarHandleByteArrayAs$Type$s extends VarHandleByteArrayBase {
convEndian(handle.be, expected), convEndian(handle.be, value)); convEndian(handle.be, expected), convEndian(handle.be, value));
} }
@ForceInline
static boolean weakCompareAndSetVolatile(ByteBufferHandle handle, Object obb, int index, $type$ expected, $type$ value) {
ByteBuffer bb = (ByteBuffer) obb;
// TODO defer to strong form until new Unsafe method is added
return UNSAFE.compareAndSwap$RawType$(
UNSAFE.getObject(bb, BYTE_BUFFER_HB),
address(bb, indexRO(bb, index)),
convEndian(handle.be, expected), convEndian(handle.be, value));
}
@ForceInline @ForceInline
static boolean weakCompareAndSetAcquire(ByteBufferHandle handle, Object obb, int index, $type$ expected, $type$ value) { static boolean weakCompareAndSetAcquire(ByteBufferHandle handle, Object obb, int index, $type$ expected, $type$ value) {
ByteBuffer bb = (ByteBuffer) obb; ByteBuffer bb = (ByteBuffer) obb;

View File

@ -25,6 +25,7 @@
package java.lang.module; package java.lang.module;
import java.io.PrintStream;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
@ -183,17 +184,20 @@ public final class Configuration {
this.nameToModule = Collections.emptyMap(); this.nameToModule = Collections.emptyMap();
} }
private Configuration(Configuration parent, Resolver resolver) { private Configuration(Configuration parent,
Map<ResolvedModule, Set<ResolvedModule>> graph = resolver.finish(this); Resolver resolver,
boolean check)
{
Map<ResolvedModule, Set<ResolvedModule>> g = resolver.finish(this, check);
Map<String, ResolvedModule> nameToModule = new HashMap<>(); Map<String, ResolvedModule> nameToModule = new HashMap<>();
for (ResolvedModule resolvedModule : graph.keySet()) { for (ResolvedModule resolvedModule : g.keySet()) {
nameToModule.put(resolvedModule.name(), resolvedModule); nameToModule.put(resolvedModule.name(), resolvedModule);
} }
this.parent = parent; this.parent = parent;
this.graph = graph; this.graph = g;
this.modules = Collections.unmodifiableSet(graph.keySet()); this.modules = Collections.unmodifiableSet(g.keySet());
this.nameToModule = Collections.unmodifiableMap(nameToModule); this.nameToModule = Collections.unmodifiableMap(nameToModule);
} }
@ -283,10 +287,10 @@ public final class Configuration {
Objects.requireNonNull(after); Objects.requireNonNull(after);
Objects.requireNonNull(roots); Objects.requireNonNull(roots);
Resolver resolver = new Resolver(before, this, after); Resolver resolver = new Resolver(before, this, after, null);
resolver.resolveRequires(roots); resolver.resolveRequires(roots);
return new Configuration(this, resolver); return new Configuration(this, resolver, true);
} }
@ -340,10 +344,32 @@ public final class Configuration {
Objects.requireNonNull(after); Objects.requireNonNull(after);
Objects.requireNonNull(roots); Objects.requireNonNull(roots);
Resolver resolver = new Resolver(before, this, after); Resolver resolver = new Resolver(before, this, after, null);
resolver.resolveRequires(roots).resolveUses(); resolver.resolveRequires(roots).resolveUses();
return new Configuration(this, resolver); return new Configuration(this, resolver, true);
}
/**
* Resolves a collection of root modules, with service binding, and with
* the empty configuration as its parent. The post resolution checks
* are optionally run.
*
* This method is used to create the configuration for the boot layer.
*/
static Configuration resolveRequiresAndUses(ModuleFinder finder,
Collection<String> roots,
boolean check,
PrintStream traceOutput)
{
Configuration parent = empty();
Resolver resolver
= new Resolver(finder, parent, ModuleFinder.empty(), traceOutput);
resolver.resolveRequires(roots).resolveUses();
return new Configuration(parent, resolver, check);
} }

View File

@ -27,13 +27,17 @@ package java.lang.module;
import java.io.InputStream; import java.io.InputStream;
import java.io.IOException; import java.io.IOException;
import java.io.PrintStream;
import java.io.UncheckedIOException; import java.io.UncheckedIOException;
import java.net.URI;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@ -45,7 +49,7 @@ import static jdk.internal.module.Checks.*;
import static java.util.Objects.*; import static java.util.Objects.*;
import jdk.internal.module.Checks; import jdk.internal.module.Checks;
import jdk.internal.module.Hasher.DependencyHashes; import jdk.internal.module.ModuleHashes;
/** /**
@ -372,7 +376,8 @@ public class ModuleDescriptor
private Provides(String service, Set<String> providers, boolean check) { private Provides(String service, Set<String> providers, boolean check) {
this.service = check ? requireServiceTypeName(service) : service; this.service = check ? requireServiceTypeName(service) : service;
providers = check ? Collections.unmodifiableSet(new HashSet<>(providers)) providers = check
? Collections.unmodifiableSet(new LinkedHashSet<>(providers))
: Collections.unmodifiableSet(providers); : Collections.unmodifiableSet(providers);
if (providers.isEmpty()) if (providers.isEmpty())
throw new IllegalArgumentException("Empty providers set"); throw new IllegalArgumentException("Empty providers set");
@ -787,7 +792,7 @@ public class ModuleDescriptor
private final String osVersion; private final String osVersion;
private final Set<String> conceals; private final Set<String> conceals;
private final Set<String> packages; private final Set<String> packages;
private final DependencyHashes hashes; private final ModuleHashes hashes;
private ModuleDescriptor(String name, private ModuleDescriptor(String name,
boolean automatic, boolean automatic,
@ -802,7 +807,7 @@ public class ModuleDescriptor
String osArch, String osArch,
String osVersion, String osVersion,
Set<String> conceals, Set<String> conceals,
DependencyHashes hashes) ModuleHashes hashes)
{ {
this.name = name; this.name = name;
@ -878,7 +883,8 @@ public class ModuleDescriptor
String osArch, String osArch,
String osVersion, String osVersion,
Set<String> conceals, Set<String> conceals,
Set<String> packages) { Set<String> packages,
ModuleHashes hashes) {
this.name = name; this.name = name;
this.automatic = automatic; this.automatic = automatic;
this.synthetic = synthetic; this.synthetic = synthetic;
@ -894,7 +900,7 @@ public class ModuleDescriptor
this.osName = osName; this.osName = osName;
this.osArch = osArch; this.osArch = osArch;
this.osVersion = osVersion; this.osVersion = osVersion;
this.hashes = null; this.hashes = hashes;
} }
/** /**
@ -1063,9 +1069,9 @@ public class ModuleDescriptor
} }
/** /**
* Returns the object with the hashes of the dependences. * Returns the object with the hashes of other modules
*/ */
Optional<DependencyHashes> hashes() { Optional<ModuleHashes> hashes() {
return Optional.ofNullable(hashes); return Optional.ofNullable(hashes);
} }
@ -1103,7 +1109,7 @@ public class ModuleDescriptor
String osArch; String osArch;
String osVersion; String osVersion;
String mainClass; String mainClass;
DependencyHashes hashes; ModuleHashes hashes;
/** /**
* Initializes a new builder with the given module name. * Initializes a new builder with the given module name.
@ -1580,7 +1586,7 @@ public class ModuleDescriptor
return this; return this;
} }
/* package */ Builder hashes(DependencyHashes hashes) { /* package */ Builder hashes(ModuleHashes hashes) {
this.hashes = hashes; this.hashes = hashes;
return this; return this;
} }
@ -1719,7 +1725,9 @@ public class ModuleDescriptor
hc = hc * 43 + Objects.hashCode(osVersion); hc = hc * 43 + Objects.hashCode(osVersion);
hc = hc * 43 + Objects.hashCode(conceals); hc = hc * 43 + Objects.hashCode(conceals);
hc = hc * 43 + Objects.hashCode(hashes); hc = hc * 43 + Objects.hashCode(hashes);
if (hc != 0) hash = hc; if (hc == 0)
hc = -1;
hash = hc;
} }
return hc; return hc;
} }
@ -1925,11 +1933,12 @@ public class ModuleDescriptor
static { static {
/** /**
* Setup the shared secret to allow code in other packages create * Setup the shared secret to allow code in other packages access
* ModuleDescriptor and associated objects directly. * private package methods in java.lang.module.
*/ */
jdk.internal.misc.SharedSecrets jdk.internal.misc.SharedSecrets
.setJavaLangModuleAccess(new jdk.internal.misc.JavaLangModuleAccess() { .setJavaLangModuleAccess(new jdk.internal.misc.JavaLangModuleAccess() {
@Override @Override
public Requires newRequires(Set<Requires.Modifier> ms, String mn) { public Requires newRequires(Set<Requires.Modifier> ms, String mn) {
return new Requires(ms, mn, false); return new Requires(ms, mn, false);
@ -1974,7 +1983,8 @@ public class ModuleDescriptor
String osArch, String osArch,
String osVersion, String osVersion,
Set<String> conceals, Set<String> conceals,
Set<String> packages) { Set<String> packages,
ModuleHashes hashes) {
return new ModuleDescriptor(name, return new ModuleDescriptor(name,
automatic, automatic,
synthetic, synthetic,
@ -1988,7 +1998,29 @@ public class ModuleDescriptor
osArch, osArch,
osVersion, osVersion,
conceals, conceals,
packages); packages,
hashes);
}
@Override
public Configuration resolveRequiresAndUses(ModuleFinder finder,
Collection<String> roots,
boolean check,
PrintStream traceOutput)
{
return Configuration.resolveRequiresAndUses(finder, roots, check, traceOutput);
}
@Override
public ModuleReference newPatchedModule(ModuleDescriptor descriptor,
URI location,
Supplier<ModuleReader> s) {
return new ModuleReference(descriptor, location, s, true, null);
}
@Override
public Optional<ModuleHashes> hashes(ModuleDescriptor descriptor) {
return descriptor.hashes();
} }
}); });
} }

View File

@ -37,11 +37,12 @@ import java.nio.BufferUnderflowException;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Supplier; import java.util.function.Supplier;
import jdk.internal.module.Hasher.DependencyHashes; import jdk.internal.module.ModuleHashes;
import static jdk.internal.module.ClassFileConstants.*; import static jdk.internal.module.ClassFileConstants.*;
@ -337,7 +338,7 @@ final class ModuleInfo {
// computeIfAbsent // computeIfAbsent
Set<String> providers = pm.get(sn); Set<String> providers = pm.get(sn);
if (providers == null) { if (providers == null) {
providers = new HashSet<>(); providers = new LinkedHashSet<>(); // preserve order
pm.put(sn, providers); pm.put(sn, providers);
} }
providers.add(cn); providers.add(cn);
@ -425,7 +426,7 @@ final class ModuleInfo {
map.put(dn, hash); map.put(dn, hash);
} }
builder.hashes(new DependencyHashes(algorithm, map)); builder.hashes(new ModuleHashes(algorithm, map));
} }

View File

@ -40,7 +40,7 @@ import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.LinkedHashSet;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
@ -52,7 +52,6 @@ import java.util.jar.Manifest;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipFile; import java.util.zip.ZipFile;
@ -190,17 +189,15 @@ class ModulePath implements ConfigurableModuleFinder {
} }
} }
if (attrs.isRegularFile() || attrs.isDirectory()) {
// packaged or exploded module // packaged or exploded module
ModuleReference mref = readModule(entry, attrs); ModuleReference mref = readModule(entry, attrs);
if (mref != null) { if (mref != null) {
String name = mref.descriptor().name(); String name = mref.descriptor().name();
return Collections.singletonMap(name, mref); return Collections.singletonMap(name, mref);
} else {
// skipped
return Collections.emptyMap();
} }
}
// not recognized
throw new FindException("Unrecognized module: " + entry);
} catch (IOException ioe) { } catch (IOException ioe) {
throw new FindException(ioe); throw new FindException(ioe);
@ -238,16 +235,13 @@ class ModulePath implements ConfigurableModuleFinder {
// module found // module found
if (mref != null) { if (mref != null) {
// can have at most one version of a module in the directory // can have at most one version of a module in the directory
String name = mref.descriptor().name(); String name = mref.descriptor().name();
if (nameToReference.put(name, mref) != null) { if (nameToReference.put(name, mref) != null) {
throw new FindException("Two versions of module " throw new FindException("Two versions of module "
+ name + " found in " + dir); + name + " found in " + dir);
} }
} }
} }
} }
@ -257,28 +251,40 @@ class ModulePath implements ConfigurableModuleFinder {
/** /**
* Locates a packaged or exploded module, returning a {@code ModuleReference} * Locates a packaged or exploded module, returning a {@code ModuleReference}
* to the module. Returns {@code null} if the module is not recognized * to the module. Returns {@code null} if the entry is skipped because it is
* as a packaged or exploded module. * to a directory that does not contain a module-info.class or it's a hidden
* file.
* *
* @throws IOException if an I/O error occurs * @throws IOException if an I/O error occurs
* @throws FindException if an error occurs parsing the module descriptor * @throws FindException if the file is not recognized as a module or an
* error occurs parsing its module descriptor
*/ */
private ModuleReference readModule(Path entry, BasicFileAttributes attrs) private ModuleReference readModule(Path entry, BasicFileAttributes attrs)
throws IOException throws IOException
{ {
try { try {
ModuleReference mref = null;
if (attrs.isDirectory()) { if (attrs.isDirectory()) {
mref = readExplodedModule(entry); return readExplodedModule(entry); // may return null
} if (attrs.isRegularFile()) { }
if (entry.toString().endsWith(".jar")) {
mref = readJar(entry); String fn = entry.getFileName().toString();
} else if (isLinkPhase && entry.toString().endsWith(".jmod")) { if (attrs.isRegularFile()) {
mref = readJMod(entry); if (fn.endsWith(".jar")) {
return readJar(entry);
} else if (fn.endsWith(".jmod")) {
if (isLinkPhase)
return readJMod(entry);
throw new FindException("JMOD files not supported: " + entry);
} }
} }
return mref;
// skip hidden files
if (fn.startsWith(".") || Files.isHidden(entry)) {
return null;
} else {
throw new FindException("Unrecognized module: " + entry);
}
} catch (InvalidModuleDescriptorException e) { } catch (InvalidModuleDescriptorException e) {
throw new FindException("Error reading module: " + entry, e); throw new FindException("Error reading module: " + entry, e);
@ -292,15 +298,17 @@ class ModulePath implements ConfigurableModuleFinder {
return zf.stream() return zf.stream()
.filter(e -> e.getName().startsWith("classes/") && .filter(e -> e.getName().startsWith("classes/") &&
e.getName().endsWith(".class")) e.getName().endsWith(".class"))
.map(e -> toPackageName(e)) .map(e -> toPackageName(e.getName().substring(8)))
.filter(pkg -> pkg.length() > 0) // module-info .filter(pkg -> pkg.length() > 0) // module-info
.distinct()
.collect(Collectors.toSet()); .collect(Collectors.toSet());
} }
/** /**
* Returns a {@code ModuleReference} to a module in jmod file on the * Returns a {@code ModuleReference} to a module in jmod file on the
* file system. * file system.
*
* @throws IOException
* @throws InvalidModuleDescriptorException
*/ */
private ModuleReference readJMod(Path file) throws IOException { private ModuleReference readJMod(Path file) throws IOException {
try (ZipFile zf = new ZipFile(file.toString())) { try (ZipFile zf = new ZipFile(file.toString())) {
@ -419,12 +427,11 @@ class ModulePath implements ConfigurableModuleFinder {
// scan the entries in the JAR file to locate the .class and service // scan the entries in the JAR file to locate the .class and service
// configuration file // configuration file
Stream<String> stream = jf.stream() Map<Boolean, Set<String>> map =
.map(e -> e.getName()) jf.stream()
.filter(e -> (e.endsWith(".class") || e.startsWith(SERVICES_PREFIX))) .map(JarEntry::getName)
.distinct(); .filter(s -> (s.endsWith(".class") ^ s.startsWith(SERVICES_PREFIX)))
Map<Boolean, Set<String>> map .collect(Collectors.partitioningBy(s -> s.endsWith(".class"),
= stream.collect(Collectors.partitioningBy(s -> s.endsWith(".class"),
Collectors.toSet())); Collectors.toSet()));
Set<String> classFiles = map.get(Boolean.TRUE); Set<String> classFiles = map.get(Boolean.TRUE);
Set<String> configFiles = map.get(Boolean.FALSE); Set<String> configFiles = map.get(Boolean.FALSE);
@ -433,19 +440,18 @@ class ModulePath implements ConfigurableModuleFinder {
classFiles.stream() classFiles.stream()
.map(c -> toPackageName(c)) .map(c -> toPackageName(c))
.distinct() .distinct()
.forEach(p -> builder.exports(p)); .forEach(builder::exports);
// map names of service configuration files to service names // map names of service configuration files to service names
Set<String> serviceNames = configFiles.stream() Set<String> serviceNames = configFiles.stream()
.map(this::toServiceName) .map(this::toServiceName)
.filter(Optional::isPresent) .flatMap(Optional::stream)
.map(Optional::get)
.collect(Collectors.toSet()); .collect(Collectors.toSet());
// parse each service configuration file // parse each service configuration file
for (String sn : serviceNames) { for (String sn : serviceNames) {
JarEntry entry = jf.getJarEntry(SERVICES_PREFIX + sn); JarEntry entry = jf.getJarEntry(SERVICES_PREFIX + sn);
Set<String> providerClasses = new HashSet<>(); Set<String> providerClasses = new LinkedHashSet<>();
try (InputStream in = jf.getInputStream(entry)) { try (InputStream in = jf.getInputStream(entry)) {
BufferedReader reader BufferedReader reader
= new BufferedReader(new InputStreamReader(in, "UTF-8")); = new BufferedReader(new InputStreamReader(in, "UTF-8"));
@ -475,19 +481,25 @@ class ModulePath implements ConfigurableModuleFinder {
private Set<String> jarPackages(JarFile jf) { private Set<String> jarPackages(JarFile jf) {
return jf.stream() return jf.stream()
.filter(e -> e.getName().endsWith(".class")) .filter(e -> e.getName().endsWith(".class"))
.map(e -> toPackageName(e)) .map(e -> toPackageName(e.getName()))
.filter(pkg -> pkg.length() > 0) // module-info .filter(pkg -> pkg.length() > 0) // module-info
.distinct()
.collect(Collectors.toSet()); .collect(Collectors.toSet());
} }
/** /**
* Returns a {@code ModuleReference} to a module in modular JAR file on * Returns a {@code ModuleReference} to a module in modular JAR file on
* the file system. * the file system.
*
* @throws IOException
* @throws FindException
* @throws InvalidModuleDescriptorException
*/ */
private ModuleReference readJar(Path file) throws IOException { private ModuleReference readJar(Path file) throws IOException {
try (JarFile jf = new JarFile(file.toString())) { try (JarFile jf = new JarFile(file.toFile(),
true, // verify
ZipFile.OPEN_READ,
JarFile.Release.RUNTIME))
{
ModuleDescriptor md; ModuleDescriptor md;
JarEntry entry = jf.getJarEntry(MODULE_INFO); JarEntry entry = jf.getJarEntry(MODULE_INFO);
if (entry == null) { if (entry == null) {
@ -520,7 +532,6 @@ class ModulePath implements ConfigurableModuleFinder {
path.toString().endsWith(".class"))) path.toString().endsWith(".class")))
.map(path -> toPackageName(dir.relativize(path))) .map(path -> toPackageName(dir.relativize(path)))
.filter(pkg -> pkg.length() > 0) // module-info .filter(pkg -> pkg.length() > 0) // module-info
.distinct()
.collect(Collectors.toSet()); .collect(Collectors.toSet());
} catch (IOException x) { } catch (IOException x) {
throw new UncheckedIOException(x); throw new UncheckedIOException(x);
@ -530,6 +541,9 @@ class ModulePath implements ConfigurableModuleFinder {
/** /**
* Returns a {@code ModuleReference} to an exploded module on the file * Returns a {@code ModuleReference} to an exploded module on the file
* system or {@code null} if {@code module-info.class} not found. * system or {@code null} if {@code module-info.class} not found.
*
* @throws IOException
* @throws InvalidModuleDescriptorException
*/ */
private ModuleReference readExplodedModule(Path dir) throws IOException { private ModuleReference readExplodedModule(Path dir) throws IOException {
Path mi = dir.resolve(MODULE_INFO); Path mi = dir.resolve(MODULE_INFO);
@ -559,19 +573,6 @@ class ModulePath implements ConfigurableModuleFinder {
} }
} }
private String toPackageName(ZipEntry entry) {
String name = entry.getName();
assert name.endsWith(".class");
// jmod classes in classes/, jar in /
int start = name.startsWith("classes/") ? 8 : 0;
int index = name.lastIndexOf("/");
if (index > start) {
return name.substring(start, index).replace('/', '.');
} else {
return "";
}
}
private String toPackageName(Path path) { private String toPackageName(Path path) {
String name = path.toString(); String name = path.toString();
assert name.endsWith(".class"); assert name.endsWith(".class");

View File

@ -142,10 +142,11 @@ public interface ModuleReader extends Closeable {
* @see ClassLoader#defineClass(String, ByteBuffer, java.security.ProtectionDomain) * @see ClassLoader#defineClass(String, ByteBuffer, java.security.ProtectionDomain)
*/ */
default Optional<ByteBuffer> read(String name) throws IOException { default Optional<ByteBuffer> read(String name) throws IOException {
Optional<InputStream> in = open(name); Optional<InputStream> oin = open(name);
if (in.isPresent()) { if (oin.isPresent()) {
byte[] bytes = in.get().readAllBytes(); try (InputStream in = oin.get()) {
return Optional.of(ByteBuffer.wrap(bytes)); return Optional.of(ByteBuffer.wrap(in.readAllBytes()));
}
} else { } else {
return Optional.empty(); return Optional.empty();
} }

View File

@ -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. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -32,7 +32,7 @@ import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.function.Supplier; import java.util.function.Supplier;
import jdk.internal.module.Hasher.HashSupplier; import jdk.internal.module.ModuleHashes.HashSupplier;
/** /**
@ -54,12 +54,33 @@ public final class ModuleReference {
private final URI location; private final URI location;
private final Supplier<ModuleReader> readerSupplier; private final Supplier<ModuleReader> readerSupplier;
// true if this is a reference to a patched module
private boolean patched;
// the function that computes the hash of this module reference // the function that computes the hash of this module reference
private final HashSupplier hasher; private final HashSupplier hasher;
// cached hash string to avoid needing to compute it many times // cached hash string to avoid needing to compute it many times
private String cachedHash; private String cachedHash;
/**
* Constructs a new instance of this class.
*/
ModuleReference(ModuleDescriptor descriptor,
URI location,
Supplier<ModuleReader> readerSupplier,
boolean patched,
HashSupplier hasher)
{
this.descriptor = Objects.requireNonNull(descriptor);
this.location = location;
this.readerSupplier = Objects.requireNonNull(readerSupplier);
this.patched = patched;
this.hasher = hasher;
}
/** /**
* Constructs a new instance of this class. * Constructs a new instance of this class.
*/ */
@ -67,11 +88,9 @@ public final class ModuleReference {
URI location, URI location,
Supplier<ModuleReader> readerSupplier, Supplier<ModuleReader> readerSupplier,
HashSupplier hasher) HashSupplier hasher)
{ {
this.descriptor = Objects.requireNonNull(descriptor); this(descriptor, location, readerSupplier, false, hasher);
this.location = location;
this.readerSupplier = Objects.requireNonNull(readerSupplier);
this.hasher = hasher;
} }
@ -96,10 +115,9 @@ public final class ModuleReference {
URI location, URI location,
Supplier<ModuleReader> readerSupplier) Supplier<ModuleReader> readerSupplier)
{ {
this(descriptor, location, readerSupplier, null); this(descriptor, location, readerSupplier, false, null);
} }
/** /**
* Returns the module descriptor. * Returns the module descriptor.
* *
@ -150,6 +168,20 @@ public final class ModuleReference {
} }
/**
* Returns {@code true} if this module has been patched via -Xpatch.
*/
boolean isPatched() {
return patched;
}
/**
* Returns the hash supplier for this module.
*/
HashSupplier hasher() {
return hasher;
}
/** /**
* Computes the hash of this module, returning it as a hex string. * Computes the hash of this module, returning it as a hex string.
* Returns {@code null} if the hash cannot be computed. * Returns {@code null} if the hash cannot be computed.
@ -166,8 +198,6 @@ public final class ModuleReference {
return result; return result;
} }
private int hash;
/** /**
* Computes a hash code for this module reference. * Computes a hash code for this module reference.
* *
@ -181,12 +211,17 @@ public final class ModuleReference {
public int hashCode() { public int hashCode() {
int hc = hash; int hc = hash;
if (hc == 0) { if (hc == 0) {
hc = Objects.hash(descriptor, location, readerSupplier, hasher); hc = Objects.hash(descriptor, location, readerSupplier, hasher,
if (hc != 0) hash = hc; Boolean.valueOf(patched));
if (hc == 0)
hc = -1;
hash = hc;
} }
return hc; return hc;
} }
private int hash;
/** /**
* Tests this module reference for equality with the given object. * Tests this module reference for equality with the given object.
* *
@ -214,7 +249,8 @@ public final class ModuleReference {
return Objects.equals(this.descriptor, that.descriptor) return Objects.equals(this.descriptor, that.descriptor)
&& Objects.equals(this.location, that.location) && Objects.equals(this.location, that.location)
&& Objects.equals(this.readerSupplier, that.readerSupplier) && Objects.equals(this.readerSupplier, that.readerSupplier)
&& Objects.equals(this.hasher, that.hasher); && Objects.equals(this.hasher, that.hasher)
&& this.patched == that.patched;
} }
/** /**

View File

@ -48,8 +48,8 @@ import java.util.zip.ZipFile;
import jdk.internal.misc.JavaLangAccess; import jdk.internal.misc.JavaLangAccess;
import jdk.internal.misc.SharedSecrets; import jdk.internal.misc.SharedSecrets;
import jdk.internal.module.Hasher; import jdk.internal.module.ModuleHashes;
import jdk.internal.module.Hasher.HashSupplier; import jdk.internal.module.ModuleHashes.HashSupplier;
import jdk.internal.module.ModulePatcher; import jdk.internal.module.ModulePatcher;
import sun.net.www.ParseUtil; import sun.net.www.ParseUtil;
@ -89,7 +89,7 @@ class ModuleReferences {
static ModuleReference newJarModule(ModuleDescriptor md, Path file) { static ModuleReference newJarModule(ModuleDescriptor md, Path file) {
URI uri = file.toUri(); URI uri = file.toUri();
Supplier<ModuleReader> supplier = () -> new JarModuleReader(file, uri); Supplier<ModuleReader> supplier = () -> new JarModuleReader(file, uri);
HashSupplier hasher = (algorithm) -> Hasher.generate(file, algorithm); HashSupplier hasher = (a) -> ModuleHashes.computeHashAsString(file, a);
return newModule(md, uri, supplier, hasher); return newModule(md, uri, supplier, hasher);
} }
@ -99,7 +99,7 @@ class ModuleReferences {
static ModuleReference newJModModule(ModuleDescriptor md, Path file) { static ModuleReference newJModModule(ModuleDescriptor md, Path file) {
URI uri = file.toUri(); URI uri = file.toUri();
Supplier<ModuleReader> supplier = () -> new JModModuleReader(file, uri); Supplier<ModuleReader> supplier = () -> new JModModuleReader(file, uri);
HashSupplier hasher = (algorithm) -> Hasher.generate(file, algorithm); HashSupplier hasher = (a) -> ModuleHashes.computeHashAsString(file, a);
return newModule(md, file.toUri(), supplier, hasher); return newModule(md, file.toUri(), supplier, hasher);
} }
@ -122,7 +122,7 @@ class ModuleReferences {
private final ReadWriteLock lock = new ReentrantReadWriteLock(); private final ReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock readLock = lock.readLock(); private final Lock readLock = lock.readLock();
private final Lock writeLock = lock.writeLock(); private final Lock writeLock = lock.writeLock();
private volatile boolean closed; private boolean closed;
SafeCloseModuleReader() { } SafeCloseModuleReader() { }
@ -198,7 +198,10 @@ class ModuleReferences {
static JarFile newJarFile(Path path) { static JarFile newJarFile(Path path) {
try { try {
return new JarFile(path.toFile()); return new JarFile(path.toFile(),
true, // verify
ZipFile.OPEN_READ,
JarFile.Release.RUNTIME);
} catch (IOException ioe) { } catch (IOException ioe) {
throw new UncheckedIOException(ioe); throw new UncheckedIOException(ioe);
} }
@ -219,6 +222,8 @@ class ModuleReferences {
if (je != null) { if (je != null) {
String encodedPath = ParseUtil.encodePath(name, false); String encodedPath = ParseUtil.encodePath(name, false);
String uris = "jar:" + uri + "!/" + encodedPath; String uris = "jar:" + uri + "!/" + encodedPath;
if (jf.isMultiRelease())
uris += "#runtime";
return Optional.of(URI.create(uris)); return Optional.of(URI.create(uris));
} else { } else {
return Optional.empty(); return Optional.empty();

View File

@ -25,8 +25,8 @@
package java.lang.module; package java.lang.module;
import java.io.PrintStream;
import java.lang.module.ModuleDescriptor.Requires.Modifier; import java.lang.module.ModuleDescriptor.Requires.Modifier;
import java.lang.reflect.Layer;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
@ -43,7 +43,7 @@ import java.util.Set;
import java.util.StringJoiner; import java.util.StringJoiner;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import jdk.internal.module.Hasher; import jdk.internal.module.ModuleHashes;
/** /**
* The resolver used by {@link Configuration#resolveRequires} and * The resolver used by {@link Configuration#resolveRequires} and
@ -55,6 +55,7 @@ final class Resolver {
private final ModuleFinder beforeFinder; private final ModuleFinder beforeFinder;
private final Configuration parent; private final Configuration parent;
private final ModuleFinder afterFinder; private final ModuleFinder afterFinder;
private final PrintStream traceOutput;
// maps module name to module reference // maps module name to module reference
private final Map<String, ModuleReference> nameToReference = new HashMap<>(); private final Map<String, ModuleReference> nameToReference = new HashMap<>();
@ -62,10 +63,12 @@ final class Resolver {
Resolver(ModuleFinder beforeFinder, Resolver(ModuleFinder beforeFinder,
Configuration parent, Configuration parent,
ModuleFinder afterFinder) { ModuleFinder afterFinder,
PrintStream traceOutput) {
this.beforeFinder = beforeFinder; this.beforeFinder = beforeFinder;
this.parent = parent; this.parent = parent;
this.afterFinder = afterFinder; this.afterFinder = afterFinder;
this.traceOutput = traceOutput;
} }
@ -76,8 +79,6 @@ final class Resolver {
*/ */
Resolver resolveRequires(Collection<String> roots) { Resolver resolveRequires(Collection<String> roots) {
long start = trace_start("Resolve");
// create the visit stack to get us started // create the visit stack to get us started
Deque<ModuleDescriptor> q = new ArrayDeque<>(); Deque<ModuleDescriptor> q = new ArrayDeque<>();
for (String root : roots) { for (String root : roots) {
@ -95,10 +96,9 @@ final class Resolver {
} }
} }
if (TRACE) { if (isTracing()) {
trace("Root module %s located", root); trace("Root module %s located", root);
if (mref.location().isPresent()) mref.location().ifPresent(uri -> trace(" (%s)", uri));
trace(" (%s)", mref.location().get());
} }
assert mref.descriptor().name().equals(root); assert mref.descriptor().name().equals(root);
@ -108,13 +108,6 @@ final class Resolver {
resolve(q); resolve(q);
if (TRACE) {
long duration = System.currentTimeMillis() - start;
Set<String> names = nameToReference.keySet();
trace("Resolver completed in %s ms", duration);
names.stream().sorted().forEach(name -> trace(" %s", name));
}
return this; return this;
} }
@ -153,11 +146,10 @@ final class Resolver {
q.offer(mref.descriptor()); q.offer(mref.descriptor());
resolved.add(mref.descriptor()); resolved.add(mref.descriptor());
if (TRACE) { if (isTracing()) {
trace("Module %s located, required by %s", trace("Module %s located, required by %s",
dn, descriptor.name()); dn, descriptor.name());
if (mref.location().isPresent()) mref.location().ifPresent(uri -> trace(" (%s)", uri));
trace(" (%s)", mref.location().get());
} }
} }
@ -175,8 +167,6 @@ final class Resolver {
*/ */
Resolver resolveUses() { Resolver resolveUses() {
long start = trace_start("Bind");
// Scan the finders for all available service provider modules. As // Scan the finders for all available service provider modules. As
// java.base uses services then then module finders will be scanned // java.base uses services then then module finders will be scanned
// anyway. // anyway.
@ -230,10 +220,10 @@ final class Resolver {
String pn = provider.name(); String pn = provider.name();
if (!nameToReference.containsKey(pn)) { if (!nameToReference.containsKey(pn)) {
if (isTracing()) {
if (TRACE && mref.location().isPresent()) mref.location()
trace(" (%s)", mref.location().get()); .ifPresent(uri -> trace(" (%s)", uri));
}
nameToReference.put(pn, mref); nameToReference.put(pn, mref);
q.push(provider); q.push(provider);
} }
@ -248,14 +238,6 @@ final class Resolver {
} while (!candidateConsumers.isEmpty()); } while (!candidateConsumers.isEmpty());
if (TRACE) {
long duration = System.currentTimeMillis() - start;
Set<String> names = nameToReference.keySet();
trace("Bind completed in %s ms", duration);
names.stream().sorted().forEach(name -> trace(" %s", name));
}
return this; return this;
} }
@ -264,23 +246,33 @@ final class Resolver {
* Execute post-resolution checks and returns the module graph of resolved * Execute post-resolution checks and returns the module graph of resolved
* modules as {@code Map}. The resolved modules will be in the given * modules as {@code Map}. The resolved modules will be in the given
* configuration. * configuration.
*
* @param check {@true} to execute the post resolution checks
*/ */
Map<ResolvedModule, Set<ResolvedModule>> finish(Configuration cf) { Map<ResolvedModule, Set<ResolvedModule>> finish(Configuration cf,
boolean check)
{
if (isTracing()) {
trace("Result:");
Set<String> names = nameToReference.keySet();
names.stream().sorted().forEach(name -> trace(" %s", name));
}
if (check) {
detectCycles(); detectCycles();
checkPlatformConstraints(); checkPlatformConstraints();
checkHashes(); checkHashes();
}
Map<ResolvedModule, Set<ResolvedModule>> graph = makeGraph(cf); Map<ResolvedModule, Set<ResolvedModule>> graph = makeGraph(cf);
if (check) {
checkExportSuppliers(graph); checkExportSuppliers(graph);
}
return graph; return graph;
} }
/** /**
* Checks the given module graph for cycles. * Checks the given module graph for cycles.
* *
@ -420,52 +412,44 @@ final class Resolver {
} }
/** /**
* Checks the hashes in the module descriptor to ensure that they match * Checks the hashes in the module descriptor to ensure that they match
* the hash of the dependency's module reference. * any recorded hashes.
*/ */
private void checkHashes() { private void checkHashes() {
for (ModuleReference mref : nameToReference.values()) { for (ModuleReference mref : nameToReference.values()) {
ModuleDescriptor descriptor = mref.descriptor(); ModuleDescriptor descriptor = mref.descriptor();
// get map of module names to hash // get map of module hashes
Optional<Hasher.DependencyHashes> ohashes = descriptor.hashes(); Optional<ModuleHashes> ohashes = descriptor.hashes();
if (!ohashes.isPresent()) if (!ohashes.isPresent())
continue; continue;
Hasher.DependencyHashes hashes = ohashes.get(); ModuleHashes hashes = ohashes.get();
// check dependences
for (ModuleDescriptor.Requires d : descriptor.requires()) {
String dn = d.name();
String recordedHash = hashes.hashFor(dn);
if (recordedHash != null) {
String algorithm = hashes.algorithm();
for (String dn : hashes.names()) {
ModuleReference other = nameToReference.get(dn); ModuleReference other = nameToReference.get(dn);
if (other == null) { if (other == null) {
other = parent.findModule(dn) other = parent.findModule(dn)
.map(ResolvedModule::reference) .map(ResolvedModule::reference)
.orElse(null); .orElse(null);
} }
if (other == null)
throw new InternalError(dn + " not found");
String actualHash = other.computeHash(hashes.algorithm()); // skip checking the hash if the module has been patched
if (other != null && !other.isPatched()) {
String recordedHash = hashes.hashFor(dn);
String actualHash = other.computeHash(algorithm);
if (actualHash == null) if (actualHash == null)
fail("Unable to compute the hash of module %s", dn); fail("Unable to compute the hash of module %s", dn);
if (!recordedHash.equals(actualHash)) { if (!recordedHash.equals(actualHash)) {
fail("Hash of %s (%s) differs to expected hash (%s)", fail("Hash of %s (%s) differs to expected hash (%s)" +
dn, actualHash, recordedHash); " recorded in %s", dn, actualHash, recordedHash,
descriptor.name());
}
}
} }
} }
}
}
} }
@ -690,6 +674,9 @@ final class Resolver {
} }
} }
// uses/provides checks not applicable to automatic modules
if (!descriptor1.isAutomatic()) {
// uses S // uses S
for (String service : descriptor1.uses()) { for (String service : descriptor1.uses()) {
String pn = packageName(service); String pn = packageName(service);
@ -723,6 +710,8 @@ final class Resolver {
} }
}
/** /**
* Invokes the beforeFinder to find method to find the given module. * Invokes the beforeFinder to find method to find the given module.
@ -796,27 +785,18 @@ final class Resolver {
throw new ResolutionException(msg); throw new ResolutionException(msg);
} }
/** /**
* Tracing support, limited to boot layer for now. * Tracing support
*/ */
private final static boolean TRACE private boolean isTracing() {
= Boolean.getBoolean("jdk.launcher.traceResolver") return traceOutput != null;
&& (Layer.boot() == null);
private String op;
private long trace_start(String op) {
this.op = op;
return System.currentTimeMillis();
} }
private void trace(String fmt, Object ... args) { private void trace(String fmt, Object ... args) {
if (TRACE) { if (traceOutput != null) {
System.out.print("[" + op + "] "); traceOutput.format("[Resolver] " + fmt, args);
System.out.format(fmt, args); traceOutput.println();
System.out.println();
} }
} }

View File

@ -44,6 +44,7 @@ import java.util.function.Supplier;
import jdk.internal.jimage.ImageLocation; import jdk.internal.jimage.ImageLocation;
import jdk.internal.jimage.ImageReader; import jdk.internal.jimage.ImageReader;
import jdk.internal.jimage.ImageReaderFactory; import jdk.internal.jimage.ImageReaderFactory;
import jdk.internal.module.ModuleHashes;
import jdk.internal.module.SystemModules; import jdk.internal.module.SystemModules;
import jdk.internal.module.ModulePatcher; import jdk.internal.module.ModulePatcher;
import jdk.internal.perf.PerfCounter; import jdk.internal.perf.PerfCounter;
@ -101,13 +102,16 @@ class SystemModuleFinder implements ModuleFinder {
for (int i = 0; i < n; i++) { for (int i = 0; i < n; i++) {
String mn = moduleNames[i]; String mn = moduleNames[i];
ModuleDescriptor md; ModuleDescriptor md;
String hash;
if (fastLoad) { if (fastLoad) {
md = descriptors[i]; md = descriptors[i];
hash = SystemModules.MODULES_TO_HASH[i];
} else { } else {
// fallback to read module-info.class // fallback to read module-info.class
// if fast loading of ModuleDescriptors is disabled // if fast loading of ModuleDescriptors is disabled
ImageLocation location = imageReader.findLocation(mn, "module-info.class"); ImageLocation location = imageReader.findLocation(mn, "module-info.class");
md = ModuleDescriptor.read(imageReader.getResourceBuffer(location)); md = ModuleDescriptor.read(imageReader.getResourceBuffer(location));
hash = null;
} }
if (!md.name().equals(mn)) if (!md.name().equals(mn))
throw new InternalError(); throw new InternalError();
@ -123,7 +127,8 @@ class SystemModuleFinder implements ModuleFinder {
} }
}; };
ModuleReference mref = new ModuleReference(md, uri, readerSupplier); ModuleReference mref =
new ModuleReference(md, uri, readerSupplier, hashSupplier(hash));
// may need a reference to a patched module if -Xpatch specified // may need a reference to a patched module if -Xpatch specified
mref = ModulePatcher.interposeIfNeeded(mref); mref = ModulePatcher.interposeIfNeeded(mref);
@ -142,6 +147,18 @@ class SystemModuleFinder implements ModuleFinder {
initTime.addElapsedTimeFrom(t0); initTime.addElapsedTimeFrom(t0);
} }
private static ModuleHashes.HashSupplier hashSupplier(String hash) {
if (hash == null)
return null;
return new ModuleHashes.HashSupplier() {
@Override
public String generate(String algorithm) {
return hash;
}
};
}
SystemModuleFinder() { } SystemModuleFinder() { }
@Override @Override

View File

@ -27,6 +27,7 @@ package java.lang.reflect;
import java.lang.module.Configuration; import java.lang.module.Configuration;
import java.lang.module.ModuleDescriptor; import java.lang.module.ModuleDescriptor;
import java.lang.module.ModuleDescriptor.Provides;
import java.lang.module.ResolvedModule; import java.lang.module.ResolvedModule;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
@ -41,6 +42,8 @@ import java.util.stream.Collectors;
import jdk.internal.loader.Loader; import jdk.internal.loader.Loader;
import jdk.internal.loader.LoaderPool; import jdk.internal.loader.LoaderPool;
import jdk.internal.misc.SharedSecrets; import jdk.internal.misc.SharedSecrets;
import jdk.internal.module.ServicesCatalog;
import jdk.internal.module.ServicesCatalog.ServiceProvider;
import sun.security.util.SecurityConstants; import sun.security.util.SecurityConstants;
@ -549,4 +552,55 @@ public final class Layer {
public static Layer boot() { public static Layer boot() {
return SharedSecrets.getJavaLangAccess().getBootLayer(); return SharedSecrets.getJavaLangAccess().getBootLayer();
} }
/**
* Returns the ServicesCatalog for this Layer, creating it if not
* already created.
*/
ServicesCatalog getServicesCatalog() {
ServicesCatalog servicesCatalog = this.servicesCatalog;
if (servicesCatalog != null)
return servicesCatalog;
Map<String, Set<ServiceProvider>> map = new HashMap<>();
for (Module m : nameToModule.values()) {
ModuleDescriptor descriptor = m.getDescriptor();
for (Provides provides : descriptor.provides().values()) {
String service = provides.service();
Set<ServiceProvider> providers
= map.computeIfAbsent(service, k -> new HashSet<>());
for (String pn : provides.providers()) {
providers.add(new ServiceProvider(m, pn));
}
}
}
ServicesCatalog catalog = new ServicesCatalog() {
@Override
public void register(Module module) {
throw new UnsupportedOperationException();
}
@Override
public Set<ServiceProvider> findServices(String service) {
Set<ServiceProvider> providers = map.get(service);
if (providers == null) {
return Collections.emptySet();
} else {
return Collections.unmodifiableSet(providers);
}
}
};
synchronized (this) {
servicesCatalog = this.servicesCatalog;
if (servicesCatalog == null) {
this.servicesCatalog = servicesCatalog = catalog;
}
}
return servicesCatalog;
}
private volatile ServicesCatalog servicesCatalog;
} }

View File

@ -43,11 +43,7 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Stream; import java.util.stream.Stream;
@ -142,9 +138,6 @@ public final class Module {
this.name = null; this.name = null;
this.loader = loader; this.loader = loader;
this.descriptor = null; this.descriptor = null;
// unnamed modules are loose
this.loose = true;
} }
@ -245,17 +238,27 @@ public final class Module {
} }
// -- readability -- // --
// true if this module reads all unnamed modules (a.k.a. loose module) // the special Module to mean reads or exported to "all unnamed modules"
private volatile boolean loose; private static final Module ALL_UNNAMED_MODULE = new Module(null);
// special Module to mean exported to "everyone"
private static final Module EVERYONE_MODULE = new Module(null);
// exported to all modules
private static final Set<Module> EVERYONE = Collections.singleton(EVERYONE_MODULE);
// -- readability --
// the modules that this module permanently reads // the modules that this module permanently reads
// (will be final when the modules are defined in reverse topology order) // (will be final when the modules are defined in reverse topology order)
private volatile Set<Module> reads; private volatile Set<Module> reads;
// created lazily, additional modules that this module reflectively reads // additional module (2nd key) that some module (1st key) reflectively reads
private volatile WeakSet<Module> transientReads; private static final WeakPairMap<Module, Module, Boolean> transientReads
= new WeakPairMap<>();
/** /**
@ -284,22 +287,19 @@ public final class Module {
// check if this module reads other // check if this module reads other
if (other.isNamed()) { if (other.isNamed()) {
Set<Module> reads = this.reads; // volatile read Set<Module> reads = this.reads; // volatile read
if (reads != null && reads.contains(other)) if (reads != null && reads.contains(other))
return true; return true;
} else {
// loose modules read all unnamed modules
if (this.loose)
return true;
} }
// check if this module reads the other module reflectively // check if this module reads the other module reflectively
WeakSet<Module> tr = this.transientReads; // volatile read if (transientReads.containsKeyPair(this, other))
if (tr != null && tr.contains(other)) return true;
// if other is an unnamed module then check if this module reads
// all unnamed modules
if (!other.isNamed()
&& transientReads.containsKeyPair(this, ALL_UNNAMED_MODULE))
return true; return true;
return false; return false;
@ -346,8 +346,7 @@ public final class Module {
} }
/** /**
* Makes the given {@code Module} readable to this module without * Updates this module to read another module without notifying the VM.
* notifying the VM.
* *
* @apiNote This method is for VM white-box testing. * @apiNote This method is for VM white-box testing.
*/ */
@ -361,40 +360,28 @@ public final class Module {
* If {@code syncVM} is {@code true} then the VM is notified. * If {@code syncVM} is {@code true} then the VM is notified.
*/ */
private void implAddReads(Module other, boolean syncVM) { private void implAddReads(Module other, boolean syncVM) {
Objects.requireNonNull(other);
// nothing to do // nothing to do
if (other == this || !this.isNamed()) if (other == this || !this.isNamed())
return; return;
// if the other is null then change this module to be loose.
if (other == null) {
if (syncVM)
addReads0(this, null);
this.loose = true;
return;
}
// check if we already read this module // check if we already read this module
Set<Module> reads = this.reads; Set<Module> reads = this.reads;
if (reads != null && reads.contains(other)) if (reads != null && reads.contains(other))
return; return;
// update VM first, just in case it fails // update VM first, just in case it fails
if (syncVM) if (syncVM) {
if (other == ALL_UNNAMED_MODULE) {
addReads0(this, null);
} else {
addReads0(this, other); addReads0(this, other);
}
}
// add reflective read // add reflective read
WeakSet<Module> tr = this.transientReads; transientReads.putIfAbsent(this, other, Boolean.TRUE);
if (tr == null) {
synchronized (this) {
tr = this.transientReads;
if (tr == null) {
tr = new WeakSet<>();
this.transientReads = tr;
}
}
}
tr.add(other);
} }
@ -404,15 +391,10 @@ public final class Module {
// (will be final when the modules are defined in reverse topology order) // (will be final when the modules are defined in reverse topology order)
private volatile Map<String, Set<Module>> exports; private volatile Map<String, Set<Module>> exports;
// created lazily, additional exports added at run-time // additional exports added at run-time
private volatile Map<String, WeakSet<Module>> transientExports; // this module (1st key), other module (2nd key), exported packages (value)
private static final WeakPairMap<Module, Module, Map<String, Boolean>>
// the special Module to mean exported to all modules transientExports = new WeakPairMap<>();
private static final Module EVERYONE_MODULE = new Module(null);
private static final Set<Module> EVERYONE = Collections.singleton(EVERYONE_MODULE);
// the special Module to mean exported to all unnamed modules
private static final Module ALL_UNNAMED_MODULE = new Module(null);
/** /**
@ -489,23 +471,9 @@ public final class Module {
if (exports != null) { if (exports != null) {
Set<Module> targets = exports.get(pn); Set<Module> targets = exports.get(pn);
if (targets != null) { if ((targets != null)
&& (targets.contains(other) || targets.contains(EVERYONE_MODULE)))
// exported to all modules
if (targets.contains(EVERYONE_MODULE))
return true; return true;
if (other != EVERYONE_MODULE) {
// exported to other
if (targets.contains(other))
return true;
// other is an unnamed module && exported to all unnamed
if (!other.isNamed() && targets.contains(ALL_UNNAMED_MODULE))
return true;
}
}
} }
return false; return false;
} }
@ -515,29 +483,27 @@ public final class Module {
* package package to the given module. * package package to the given module.
*/ */
private boolean isExportedReflectively(String pn, Module other) { private boolean isExportedReflectively(String pn, Module other) {
Map<String, WeakSet<Module>> te = this.transientExports;
if (te != null) {
WeakSet<Module> targets = te.get(pn);
if (targets != null) {
// exported to all modules // exported to all modules
if (targets.contains(EVERYONE_MODULE)) Map<String, ?> exports = transientExports.get(this, EVERYONE_MODULE);
if (exports != null && exports.containsKey(pn))
return true; return true;
if (other != EVERYONE_MODULE) { if (other != EVERYONE_MODULE) {
// exported to other // exported to other
if (targets.contains(other)) exports = transientExports.get(this, other);
if (exports != null && exports.containsKey(pn))
return true; return true;
// other is an unnamed module && exported to all unnamed // other is an unnamed module && exported to all unnamed
if (!other.isNamed() && targets.contains(ALL_UNNAMED_MODULE)) if (!other.isNamed()) {
exports = transientExports.get(this, ALL_UNNAMED_MODULE);
if (exports != null && exports.containsKey(pn))
return true; return true;
} }
}
} }
return false; return false;
} }
@ -638,34 +604,19 @@ public final class Module {
} }
} }
// create transientExports if needed
Map<String, WeakSet<Module>> te = this.transientExports; // read
if (te == null) {
synchronized (this) {
te = this.transientExports;
if (te == null) {
te = new ConcurrentHashMap<>();
this.transientExports = te; // volatile write
}
}
}
// add package name to transientExports if absent // add package name to transientExports if absent
WeakSet<Module> s = te.get(pn); transientExports
if (s == null) { .computeIfAbsent(this, other,
s = new WeakSet<>(); (_this, _other) -> new ConcurrentHashMap<>())
WeakSet<Module> prev = te.putIfAbsent(pn, s); .putIfAbsent(pn, Boolean.TRUE);
if (prev != null)
s = prev;
}
s.add(other);
} }
// -- services -- // -- services --
// created lazily, additional service types that this module uses // additional service type (2nd key) that some module (1st key) uses
private volatile WeakSet<Class<?>> transientUses; private static final WeakPairMap<Module, Class<?>, Boolean> transientUses
= new WeakPairMap<>();
/** /**
* If the caller's module is this module then update this module to add a * If the caller's module is this module then update this module to add a
@ -702,17 +653,7 @@ public final class Module {
} }
if (!canUse(st)) { if (!canUse(st)) {
WeakSet<Class<?>> uses = this.transientUses; transientUses.putIfAbsent(this, st, Boolean.TRUE);
if (uses == null) {
synchronized (this) {
uses = this.transientUses;
if (uses == null) {
uses = new WeakSet<>();
this.transientUses = uses;
}
}
}
uses.add(st);
} }
} }
@ -746,11 +687,7 @@ public final class Module {
return true; return true;
// uses added via addUses // uses added via addUses
WeakSet<Class<?>> uses = this.transientUses; return transientUses.containsKeyPair(this, st);
if (uses != null && uses.contains(st))
return true;
return false;
} }
@ -885,7 +822,7 @@ public final class Module {
// -- creating Module objects -- // -- creating Module objects --
/** /**
* Find the runtime Module corresponding to the given ReadDependence * Find the runtime Module corresponding to the given ResolvedModule
* in the given parent Layer (or its parents). * in the given parent Layer (or its parents).
*/ */
private static Module find(ResolvedModule resolvedModule, Layer layer) { private static Module find(ResolvedModule resolvedModule, Layer layer) {
@ -969,7 +906,7 @@ public final class Module {
// automatic modules reads all unnamed modules // automatic modules reads all unnamed modules
if (descriptor.isAutomatic()) { if (descriptor.isAutomatic()) {
m.implAddReads(null, true); m.implAddReads(ALL_UNNAMED_MODULE, true);
} }
// exports // exports
@ -1097,7 +1034,7 @@ public final class Module {
* the representation is the string {@code "module"}, followed by a space, * the representation is the string {@code "module"}, followed by a space,
* and then the module name. For an unnamed module, the representation is * and then the module name. For an unnamed module, the representation is
* the string {@code "unnamed module"}, followed by a space, and then an * the string {@code "unnamed module"}, followed by a space, and then an
* implementation specific identifier for the unnamed module. * implementation specific string that identifies the unnamed module.
* *
* @return The string representation of this module * @return The string representation of this module
*/ */
@ -1112,46 +1049,6 @@ public final class Module {
} }
// -- supporting classes --
/**
* A "not-a-Set" set of weakly referenced objects that supports concurrent
* access.
*/
private static class WeakSet<E> {
private final ReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock readLock = lock.readLock();
private final Lock writeLock = lock.writeLock();
private final WeakHashMap<E, Boolean> map = new WeakHashMap<>();
/**
* Adds the specified element to the set.
*/
void add(E e) {
writeLock.lock();
try {
map.put(e, Boolean.TRUE);
} finally {
writeLock.unlock();
}
}
/**
* Returns {@code true} if this set contains the specified element.
*/
boolean contains(E e) {
readLock.lock();
try {
return map.containsKey(e);
} finally {
readLock.unlock();
}
}
}
// -- native methods -- // -- native methods --
// JVM_DefineModule // JVM_DefineModule
@ -1196,8 +1093,12 @@ public final class Module {
m1.implAddReads(m2, true); m1.implAddReads(m2, true);
} }
@Override @Override
public void addReadsAllUnnamed(Module m) {
m.implAddReads(Module.ALL_UNNAMED_MODULE);
}
@Override
public void addExports(Module m, String pn, Module other) { public void addExports(Module m, String pn, Module other) {
m.implAddExports(pn, Objects.requireNonNull(other), true); m.implAddExports(pn, other, true);
} }
@Override @Override
public void addExportsToAll(Module m, String pn) { public void addExportsToAll(Module m, String pn) {
@ -1211,6 +1112,10 @@ public final class Module {
public void addPackage(Module m, String pn) { public void addPackage(Module m, String pn) {
m.implAddPackage(pn, true); m.implAddPackage(pn, true);
} }
@Override
public ServicesCatalog getServicesCatalog(Layer layer) {
return layer.getServicesCatalog();
}
}); });
} }
} }

View File

@ -582,7 +582,7 @@ public class Proxy implements java.io.Serializable {
} }
private static final String DEBUG = private static final String DEBUG =
GetPropertyAction.getProperty("jdk.proxy.debug", ""); GetPropertyAction.privilegedGetProperty("jdk.proxy.debug", "");
private static boolean isDebug() { private static boolean isDebug() {
return !DEBUG.isEmpty(); return !DEBUG.isEmpty();

View File

@ -0,0 +1,354 @@
/*
* 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. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package java.lang.reflect;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.Collection;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiFunction;
/**
* A WeakHashMap-like data structure that uses a pair of weakly-referenced keys
* with identity equality semantics to associate a strongly-referenced value.
* Unlike WeakHashMap, this data structure is thread-safe.
*
* @param <K1> the type of 1st key in key pair
* @param <K2> the type of 2nd key in key pair
* @param <V> the type of value
* @author Peter Levart
*/
final class WeakPairMap<K1, K2, V> {
private final ConcurrentHashMap<Pair<K1, K2>, V> map = new ConcurrentHashMap<>();
private final ReferenceQueue<Object> queue = new ReferenceQueue<>();
/**
* Tests if the specified pair of keys are associated with a value
* in the WeakPairMap.
*
* @param k1 the 1st of the pair of keys
* @param k2 the 2nd of the pair of keys
* @return true if and only if the specified key pair is in this WeakPairMap,
* as determined by the identity comparison; false otherwise
* @throws NullPointerException if any of the specified keys is null
*/
public boolean containsKeyPair(K1 k1, K2 k2) {
expungeStaleAssociations();
return map.containsKey(Pair.lookup(k1, k2));
}
/**
* Returns the value to which the specified pair of keys is mapped, or null
* if this WeakPairMap contains no mapping for the key pair.
* <p>More formally, if this WeakPairMap contains a mapping from a key pair
* {@code (_k1, _k2)} to a value {@code v} such that
* {@code k1 == _k1 && k2 == _k2}, then this method returns {@code v};
* otherwise it returns {@code null}.
* (There can be at most one such mapping.)
*
* @param k1 the 1st of the pair of keys for which the mapped value is to
* be returned
* @param k2 the 2nd of the pair of keys for which the mapped value is to
* be returned
* @return the value to which the specified key pair is mapped, or null if
* this map contains no mapping for the key pair
* @throws NullPointerException if any of the specified keys is null
*/
public V get(K1 k1, K2 k2) {
expungeStaleAssociations();
return map.get(Pair.lookup(k1, k2));
}
/**
* Maps the specified key pair to the specified value in this WeakPairMap.
* Neither the keys nor the value can be null.
* <p>The value can be retrieved by calling the {@link #get} method
* with the the same keys (compared by identity).
*
* @param k1 the 1st of the pair of keys with which the specified value is to
* be associated
* @param k2 the 2nd of the pair of keys with which the specified value is to
* be associated
* @param v value to be associated with the specified key pair
* @return the previous value associated with key pair, or {@code null} if
* there was no mapping for key pair
* @throws NullPointerException if any of the specified keys or value is null
*/
public V put(K1 k1, K2 k2, V v) {
expungeStaleAssociations();
return map.put(Pair.weak(k1, k2, queue), v);
}
/**
* If the specified key pair is not already associated with a value,
* associates it with the given value and returns {@code null}, else does
* nothing and returns the currently associated value.
*
* @param k1 the 1st of the pair of keys with which the specified value is to
* be associated
* @param k2 the 2nd of the pair of keys with which the specified value is to
* be associated
* @param v value to be associated with the specified key pair
* @return the previous value associated with key pair, or {@code null} if
* there was no mapping for key pair
* @throws NullPointerException if any of the specified keys or value is null
*/
public V putIfAbsent(K1 k1, K2 k2, V v) {
expungeStaleAssociations();
return map.putIfAbsent(Pair.weak(k1, k2, queue), v);
}
/**
* If the specified key pair is not already associated with a value,
* attempts to compute its value using the given mapping function
* and enters it into this WeakPairMap unless {@code null}. The entire
* method invocation is performed atomically, so the function is
* applied at most once per key pair. Some attempted update operations
* on this WeakPairMap by other threads may be blocked while computation
* is in progress, so the computation should be short and simple,
* and must not attempt to update any other mappings of this WeakPairMap.
*
* @param k1 the 1st of the pair of keys with which the
* computed value is to be associated
* @param k2 the 2nd of the pair of keys with which the
* computed value is to be associated
* @param mappingFunction the function to compute a value
* @return the current (existing or computed) value associated with
* the specified key pair, or null if the computed value is null
* @throws NullPointerException if any of the specified keys or
* mappingFunction is null
* @throws IllegalStateException if the computation detectably
* attempts a recursive update to this map
* that would otherwise never complete
* @throws RuntimeException or Error if the mappingFunction does so, in
* which case the mapping is left unestablished
*/
public V computeIfAbsent(K1 k1, K2 k2,
BiFunction<? super K1, ? super K2, ? extends V>
mappingFunction) {
expungeStaleAssociations();
try {
return map.computeIfAbsent(
Pair.weak(k1, k2, queue),
pair -> mappingFunction.apply(pair.first(), pair.second()));
} finally {
Reference.reachabilityFence(k1);
Reference.reachabilityFence(k2);
}
}
/**
* Returns a {@link Collection} view of the values contained in this
* WeakPairMap. The collection is backed by the WeakPairMap, so changes to
* the map are reflected in the collection, and vice-versa. The collection
* supports element removal, which removes the corresponding
* mapping from this map, via the {@code Iterator.remove},
* {@code Collection.remove}, {@code removeAll},
* {@code retainAll}, and {@code clear} operations. It does not
* support the {@code add} or {@code addAll} operations.
*
* @return the collection view
*/
public Collection<V> values() {
expungeStaleAssociations();
return map.values();
}
/**
* Removes associations from this WeakPairMap for which at least one of the
* keys in key pair has been found weakly-reachable and corresponding
* WeakRefPeer(s) enqueued. Called as part of each public operation.
*/
private void expungeStaleAssociations() {
WeakRefPeer<?> peer;
while ((peer = (WeakRefPeer<?>) queue.poll()) != null) {
map.remove(peer.weakPair());
}
}
/**
* Common interface of both {@link Weak} and {@link Lookup} key pairs.
*/
private interface Pair<K1, K2> {
static <K1, K2> Pair<K1, K2> weak(K1 k1, K2 k2,
ReferenceQueue<Object> queue) {
return new Weak<>(k1, k2, queue);
}
static <K1, K2> Pair<K1, K2> lookup(K1 k1, K2 k2) {
return new Lookup<>(k1, k2);
}
/**
* @return The 1st of the pair of keys (may be null for {@link Weak}
* when it gets cleared)
*/
K1 first();
/**
* @return The 2nd of the pair of keys (may be null for {@link Weak}
* when it gets cleared)
*/
K2 second();
static int hashCode(Object first, Object second) {
// assert first != null && second != null;
return System.identityHashCode(first) ^
System.identityHashCode(second);
}
static boolean equals(Object first, Object second, Pair<?, ?> p) {
return first != null && second != null &&
first == p.first() && second == p.second();
}
/**
* A Pair where both keys are weakly-referenced.
* It is composed of two instances of {@link WeakRefPeer}s:
* <pre>{@code
*
* +-referent-> [K1] +-referent-> [K2]
* | |
* +----------------+ +----------------+
* | Pair.Weak <: |-----peer----->| (anonymous) <: |
* | WeakRefPeer, | | WeakRefPeer |
* | Pair |<--weakPair()--| |
* +----------------+ +----------------+
* | ^
* | |
* +-weakPair()-+
*
* }</pre>
* <p>
* Pair.Weak is used for CHM keys. Both peers are associated with the
* same {@link ReferenceQueue} so when either of their referents
* becomes weakly-reachable, the corresponding entries can be
* {@link #expungeStaleAssociations() expunged} from the map.
*/
final class Weak<K1, K2> extends WeakRefPeer<K1> implements Pair<K1, K2> {
// saved hash so it can be retrieved after the reference is cleared
private final int hash;
// link to <K2> peer
private final WeakRefPeer<K2> peer;
Weak(K1 k1, K2 k2, ReferenceQueue<Object> queue) {
super(k1, queue);
hash = Pair.hashCode(k1, k2);
peer = new WeakRefPeer<>(k2, queue) {
// link back to <K1> peer
@Override
Weak<?, ?> weakPair() { return Weak.this; }
};
}
@Override
Weak<?, ?> weakPair() {
return this;
}
@Override
public K1 first() {
return get();
}
@Override
public K2 second() {
return peer.get();
}
@Override
public int hashCode() {
return hash;
}
@Override
public boolean equals(Object obj) {
return this == obj ||
(obj instanceof Pair &&
Pair.equals(first(), second(), (Pair<?, ?>) obj));
}
}
/**
* Optimized lookup Pair, used as lookup key in methods like
* {@link java.util.Map#get(Object)} or
* {@link java.util.Map#containsKey(Object)}) where
* there is a great chance its allocation is eliminated
* by escape analysis when such lookups are inlined by JIT.
* All its methods are purposely designed so that 'this' is never
* passed to any other method or used as identity.
*/
final class Lookup<K1, K2> implements Pair<K1, K2> {
private final K1 k1;
private final K2 k2;
Lookup(K1 k1, K2 k2) {
this.k1 = Objects.requireNonNull(k1);
this.k2 = Objects.requireNonNull(k2);
}
@Override
public K1 first() {
return k1;
}
@Override
public K2 second() {
return k2;
}
@Override
public int hashCode() {
return Pair.hashCode(k1, k2);
}
@Override
public boolean equals(Object obj) {
return obj instanceof Pair &&
Pair.equals(k1, k2, (Pair<?, ?>) obj);
}
}
}
/**
* Common abstract supertype of a pair of WeakReference peers.
*/
private static abstract class WeakRefPeer<K> extends WeakReference<K> {
WeakRefPeer(K k, ReferenceQueue<Object> queue) {
super(Objects.requireNonNull(k), queue);
}
/**
* @return the {@link Pair.Weak} side of the pair of peers.
*/
abstract Pair.Weak<?, ?> weakPair();
}
}

View File

@ -1536,7 +1536,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
* be performed to generate a result with the specified scale, the * be performed to generate a result with the specified scale, the
* specified rounding mode is applied. * specified rounding mode is applied.
* *
* <p>The new {@link #divide(BigDecimal, int, RoundingMode)} method * @deprecated The method {@link #divide(BigDecimal, int, RoundingMode)}
* should be used in preference to this legacy method. * should be used in preference to this legacy method.
* *
* @param divisor value by which this {@code BigDecimal} is to be divided. * @param divisor value by which this {@code BigDecimal} is to be divided.
@ -1558,6 +1558,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
* @see #ROUND_HALF_EVEN * @see #ROUND_HALF_EVEN
* @see #ROUND_UNNECESSARY * @see #ROUND_UNNECESSARY
*/ */
@Deprecated(since="9")
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) { public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {
if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY) if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY)
throw new IllegalArgumentException("Invalid rounding mode"); throw new IllegalArgumentException("Invalid rounding mode");
@ -1602,7 +1603,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
* rounding must be performed to generate a result with the given * rounding must be performed to generate a result with the given
* scale, the specified rounding mode is applied. * scale, the specified rounding mode is applied.
* *
* <p>The new {@link #divide(BigDecimal, RoundingMode)} method * @deprecated The method {@link #divide(BigDecimal, RoundingMode)}
* should be used in preference to this legacy method. * should be used in preference to this legacy method.
* *
* @param divisor value by which this {@code BigDecimal} is to be divided. * @param divisor value by which this {@code BigDecimal} is to be divided.
@ -1623,6 +1624,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
* @see #ROUND_HALF_EVEN * @see #ROUND_HALF_EVEN
* @see #ROUND_UNNECESSARY * @see #ROUND_UNNECESSARY
*/ */
@Deprecated(since="9")
public BigDecimal divide(BigDecimal divisor, int roundingMode) { public BigDecimal divide(BigDecimal divisor, int roundingMode) {
return this.divide(divisor, scale, roundingMode); return this.divide(divisor, scale, roundingMode);
} }
@ -2267,14 +2269,20 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
* Rounding mode to round away from zero. Always increments the * Rounding mode to round away from zero. Always increments the
* digit prior to a nonzero discarded fraction. Note that this rounding * digit prior to a nonzero discarded fraction. Note that this rounding
* mode never decreases the magnitude of the calculated value. * mode never decreases the magnitude of the calculated value.
*
* @deprecated Use {@link RoundingMode#UP} instead.
*/ */
@Deprecated(since="9")
public static final int ROUND_UP = 0; public static final int ROUND_UP = 0;
/** /**
* Rounding mode to round towards zero. Never increments the digit * Rounding mode to round towards zero. Never increments the digit
* prior to a discarded fraction (i.e., truncates). Note that this * prior to a discarded fraction (i.e., truncates). Note that this
* rounding mode never increases the magnitude of the calculated value. * rounding mode never increases the magnitude of the calculated value.
*
* @deprecated Use {@link RoundingMode#DOWN} instead.
*/ */
@Deprecated(since="9")
public static final int ROUND_DOWN = 1; public static final int ROUND_DOWN = 1;
/** /**
@ -2283,7 +2291,10 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
* {@code ROUND_UP}; if negative, behaves as for * {@code ROUND_UP}; if negative, behaves as for
* {@code ROUND_DOWN}. Note that this rounding mode never * {@code ROUND_DOWN}. Note that this rounding mode never
* decreases the calculated value. * decreases the calculated value.
*
* @deprecated Use {@link RoundingMode#CEILING} instead.
*/ */
@Deprecated(since="9")
public static final int ROUND_CEILING = 2; public static final int ROUND_CEILING = 2;
/** /**
@ -2292,7 +2303,10 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
* {@code ROUND_DOWN}; if negative, behave as for * {@code ROUND_DOWN}; if negative, behave as for
* {@code ROUND_UP}. Note that this rounding mode never * {@code ROUND_UP}. Note that this rounding mode never
* increases the calculated value. * increases the calculated value.
*
* @deprecated Use {@link RoundingMode#FLOOR} instead.
*/ */
@Deprecated(since="9")
public static final int ROUND_FLOOR = 3; public static final int ROUND_FLOOR = 3;
/** /**
@ -2302,7 +2316,10 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
* &ge; 0.5; otherwise, behaves as for {@code ROUND_DOWN}. Note * &ge; 0.5; otherwise, behaves as for {@code ROUND_DOWN}. Note
* that this is the rounding mode that most of us were taught in * that this is the rounding mode that most of us were taught in
* grade school. * grade school.
*
* @deprecated Use {@link RoundingMode#HALF_UP} instead.
*/ */
@Deprecated(since="9")
public static final int ROUND_HALF_UP = 4; public static final int ROUND_HALF_UP = 4;
/** /**
@ -2311,7 +2328,10 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
* down. Behaves as for {@code ROUND_UP} if the discarded * down. Behaves as for {@code ROUND_UP} if the discarded
* fraction is {@literal >} 0.5; otherwise, behaves as for * fraction is {@literal >} 0.5; otherwise, behaves as for
* {@code ROUND_DOWN}. * {@code ROUND_DOWN}.
*
* @deprecated Use {@link RoundingMode#HALF_DOWN} instead.
*/ */
@Deprecated(since="9")
public static final int ROUND_HALF_DOWN = 5; public static final int ROUND_HALF_DOWN = 5;
/** /**
@ -2323,7 +2343,10 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
* {@code ROUND_HALF_DOWN} if it's even. Note that this is the * {@code ROUND_HALF_DOWN} if it's even. Note that this is the
* rounding mode that minimizes cumulative error when applied * rounding mode that minimizes cumulative error when applied
* repeatedly over a sequence of calculations. * repeatedly over a sequence of calculations.
*
* @deprecated Use {@link RoundingMode#HALF_EVEN} instead.
*/ */
@Deprecated(since="9")
public static final int ROUND_HALF_EVEN = 6; public static final int ROUND_HALF_EVEN = 6;
/** /**
@ -2331,7 +2354,10 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
* result, hence no rounding is necessary. If this rounding mode is * result, hence no rounding is necessary. If this rounding mode is
* specified on an operation that yields an inexact result, an * specified on an operation that yields an inexact result, an
* {@code ArithmeticException} is thrown. * {@code ArithmeticException} is thrown.
*
* @deprecated Use {@link RoundingMode#UNNECESSARY} instead.
*/ */
@Deprecated(since="9")
public static final int ROUND_UNNECESSARY = 7; public static final int ROUND_UNNECESSARY = 7;
@ -2408,7 +2434,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
* Instead, {@code setScale} returns an object with the proper * Instead, {@code setScale} returns an object with the proper
* scale; the returned object may or may not be newly allocated. * scale; the returned object may or may not be newly allocated.
* *
* <p>The new {@link #setScale(int, RoundingMode)} method should * @deprecated The method {@link #setScale(int, RoundingMode)} should
* be used in preference to this legacy method. * be used in preference to this legacy method.
* *
* @param newScale scale of the {@code BigDecimal} value to be returned. * @param newScale scale of the {@code BigDecimal} value to be returned.
@ -2431,6 +2457,7 @@ public class BigDecimal extends Number implements Comparable<BigDecimal> {
* @see #ROUND_HALF_EVEN * @see #ROUND_HALF_EVEN
* @see #ROUND_UNNECESSARY * @see #ROUND_UNNECESSARY
*/ */
@Deprecated(since="9")
public BigDecimal setScale(int newScale, int roundingMode) { public BigDecimal setScale(int newScale, int roundingMode) {
if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY) if (roundingMode < ROUND_UP || roundingMode > ROUND_UNNECESSARY)
throw new IllegalArgumentException("Invalid rounding mode"); throw new IllegalArgumentException("Invalid rounding mode");

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -90,6 +90,7 @@ package java.math;
* @author Joseph D. Darcy * @author Joseph D. Darcy
* @since 1.5 * @since 1.5
*/ */
@SuppressWarnings("deprecation") // Legacy rounding mode constants in BigDecimal
public enum RoundingMode { public enum RoundingMode {
/** /**

View File

@ -52,7 +52,8 @@ abstract class AbstractPlainDatagramSocketImpl extends DatagramSocketImpl
protected InetAddress connectedAddress = null; protected InetAddress connectedAddress = null;
private int connectedPort = -1; private int connectedPort = -1;
private static final String os = GetPropertyAction.getProperty("os.name"); private static final String os =
GetPropertyAction.privilegedGetProperty("os.name");
/** /**
* flag set if the native connect() call not to be used * flag set if the native connect() call not to be used

View File

@ -1124,7 +1124,7 @@ class InetAddress implements java.io.Serializable {
private static NameService createNameService() { private static NameService createNameService() {
String hostsFileName = String hostsFileName =
GetPropertyAction.getProperty("jdk.net.hosts.file"); GetPropertyAction.privilegedGetProperty("jdk.net.hosts.file");
NameService theNameService; NameService theNameService;
if (hostsFileName != null) { if (hostsFileName != null) {
theNameService = new HostsFileNameService(hostsFileName); theNameService = new HostsFileNameService(hostsFileName);
@ -1643,9 +1643,11 @@ class InetAddress implements java.io.Serializable {
* property can vary across implementations of the java. * property can vary across implementations of the java.
* classes. The default is an empty String "". * classes. The default is an empty String "".
*/ */
String prefix = GetPropertyAction.getProperty("impl.prefix", ""); String prefix = GetPropertyAction.privilegedGetProperty("impl.prefix", "");
try { try {
impl = Class.forName("java.net." + prefix + implName).newInstance(); @SuppressWarnings("deprecation")
Object tmp = Class.forName("java.net." + prefix + implName).newInstance();
impl = tmp;
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
System.err.println("Class not found: java.net." + prefix + System.err.println("Class not found: java.net." + prefix +
implName + ":\ncheck impl.prefix property " + implName + ":\ncheck impl.prefix property " +
@ -1662,7 +1664,9 @@ class InetAddress implements java.io.Serializable {
if (impl == null) { if (impl == null) {
try { try {
impl = Class.forName(implName).newInstance(); @SuppressWarnings("deprecation")
Object tmp = Class.forName(implName).newInstance();
impl = tmp;
} catch (Exception e) { } catch (Exception e) {
throw new Error("System property impl.prefix incorrect"); throw new Error("System property impl.prefix incorrect");
} }

View File

@ -71,7 +71,9 @@ public abstract class ProxySelector {
try { try {
Class<?> c = Class.forName("sun.net.spi.DefaultProxySelector"); Class<?> c = Class.forName("sun.net.spi.DefaultProxySelector");
if (c != null && ProxySelector.class.isAssignableFrom(c)) { if (c != null && ProxySelector.class.isAssignableFrom(c)) {
theProxySelector = (ProxySelector) c.newInstance(); @SuppressWarnings("deprecation")
ProxySelector tmp = (ProxySelector) c.newInstance();
theProxySelector = tmp;
} }
} catch (Exception e) { } catch (Exception e) {
theProxySelector = null; theProxySelector = null;

View File

@ -178,7 +178,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
userName = pw.getUserName(); userName = pw.getUserName();
password = new String(pw.getPassword()); password = new String(pw.getPassword());
} else { } else {
userName = GetPropertyAction.getProperty("user.name"); userName = GetPropertyAction.privilegedGetProperty("user.name");
} }
if (userName == null) if (userName == null)
return false; return false;
@ -1088,7 +1088,7 @@ class SocksSocketImpl extends PlainSocketImpl implements SocksConsts {
userName = System.getProperty("user.name"); userName = System.getProperty("user.name");
} catch (SecurityException se) { /* swallow Exception */ } } catch (SecurityException se) { /* swallow Exception */ }
} else { } else {
userName = GetPropertyAction.getProperty("user.name"); userName = GetPropertyAction.privilegedGetProperty("user.name");
} }
return userName; return userName;
} }

View File

@ -1198,8 +1198,9 @@ public final class URL implements java.io.Serializable {
public URLStreamHandler createURLStreamHandler(String protocol) { public URLStreamHandler createURLStreamHandler(String protocol) {
String name = PREFIX + "." + protocol + ".Handler"; String name = PREFIX + "." + protocol + ".Handler";
try { try {
Class<?> c = Class.forName(name); @SuppressWarnings("deprecation")
return (URLStreamHandler)c.newInstance(); Object o = Class.forName(name).newInstance();
return (URLStreamHandler)o;
} catch (ClassNotFoundException x) { } catch (ClassNotFoundException x) {
// ignore // ignore
} catch (Exception e) { } catch (Exception e) {
@ -1212,7 +1213,7 @@ public final class URL implements java.io.Serializable {
private static URLStreamHandler lookupViaProperty(String protocol) { private static URLStreamHandler lookupViaProperty(String protocol) {
String packagePrefixList = String packagePrefixList =
GetPropertyAction.getProperty(protocolPathProp); GetPropertyAction.privilegedGetProperty(protocolPathProp);
if (packagePrefixList == null) { if (packagePrefixList == null) {
// not set // not set
return null; return null;
@ -1234,7 +1235,9 @@ public final class URL implements java.io.Serializable {
} }
} }
if (cls != null) { if (cls != null) {
handler = (URLStreamHandler)cls.newInstance(); @SuppressWarnings("deprecation")
Object tmp = cls.newInstance();
handler = (URLStreamHandler)tmp;
} }
} catch (Exception e) { } catch (Exception e) {
// any number of exceptions can get thrown here // any number of exceptions can get thrown here

View File

@ -1323,7 +1323,9 @@ public abstract class URLConnection {
} }
} }
if (cls != null) { if (cls != null) {
return (ContentHandler) cls.newInstance(); @SuppressWarnings("deprecation")
Object tmp = cls.newInstance();
return (ContentHandler) tmp;
} }
} catch(Exception ignored) { } } catch(Exception ignored) { }
} }
@ -1397,7 +1399,7 @@ public abstract class URLConnection {
*/ */
private String getContentHandlerPkgPrefixes() { private String getContentHandlerPkgPrefixes() {
String packagePrefixList = String packagePrefixList =
GetPropertyAction.getProperty(contentPathProp, ""); GetPropertyAction.privilegedGetProperty(contentPathProp, "");
if (packagePrefixList != "") { if (packagePrefixList != "") {
packagePrefixList += "|"; packagePrefixList += "|";

View File

@ -133,7 +133,7 @@ public class URLEncoder {
dontNeedEncoding.set('.'); dontNeedEncoding.set('.');
dontNeedEncoding.set('*'); dontNeedEncoding.set('*');
dfltEncName = GetPropertyAction.getProperty("file.encoding"); dfltEncName = GetPropertyAction.privilegedGetProperty("file.encoding");
} }
/** /**

View File

@ -94,9 +94,10 @@ public abstract class AsynchronousChannelProvider {
if (cn == null) if (cn == null)
return null; return null;
try { try {
Class<?> c = Class.forName(cn, true, @SuppressWarnings("deprecation")
ClassLoader.getSystemClassLoader()); Object tmp = Class.forName(cn, true,
return (AsynchronousChannelProvider)c.newInstance(); ClassLoader.getSystemClassLoader()).newInstance();
return (AsynchronousChannelProvider)tmp;
} catch (ClassNotFoundException x) { } catch (ClassNotFoundException x) {
throw new ServiceConfigurationError(null, x); throw new ServiceConfigurationError(null, x);
} catch (IllegalAccessException x) { } catch (IllegalAccessException x) {

View File

@ -95,9 +95,10 @@ public abstract class SelectorProvider {
if (cn == null) if (cn == null)
return false; return false;
try { try {
Class<?> c = Class.forName(cn, true, @SuppressWarnings("deprecation")
ClassLoader.getSystemClassLoader()); Object tmp = Class.forName(cn, true,
provider = (SelectorProvider)c.newInstance(); ClassLoader.getSystemClassLoader()).newInstance();
provider = (SelectorProvider)tmp;
return true; return true;
} catch (ClassNotFoundException x) { } catch (ClassNotFoundException x) {
throw new ServiceConfigurationError(null, x); throw new ServiceConfigurationError(null, x);

View File

@ -283,8 +283,8 @@ public abstract class Charset
if (level == null) { if (level == null) {
if (!VM.isBooted()) if (!VM.isBooted())
return false; return false;
bugLevel = level = bugLevel = level = GetPropertyAction
GetPropertyAction.getProperty("sun.nio.cs.bugLevel", ""); .privilegedGetProperty("sun.nio.cs.bugLevel", "");
} }
return level.equals(bl); return level.equals(bl);
} }
@ -609,7 +609,8 @@ public abstract class Charset
public static Charset defaultCharset() { public static Charset defaultCharset() {
if (defaultCharset == null) { if (defaultCharset == null) {
synchronized (Charset.class) { synchronized (Charset.class) {
String csn = GetPropertyAction.getProperty("file.encoding"); String csn = GetPropertyAction
.privilegedGetProperty("file.encoding");
Charset cs = lookup(csn); Charset cs = lookup(csn);
if (cs != null) if (cs != null)
defaultCharset = cs; defaultCharset = cs;

View File

@ -46,7 +46,7 @@ class TempFileHelper {
// temporary directory location // temporary directory location
private static final Path tmpdir = private static final Path tmpdir =
Paths.get(GetPropertyAction.getProperty("java.io.tmpdir")); Paths.get(GetPropertyAction.privilegedGetProperty("java.io.tmpdir"));
private static final boolean isPosix = private static final boolean isPosix =
FileSystems.getDefault().supportedFileAttributeViews().contains("posix"); FileSystems.getDefault().supportedFileAttributeViews().contains("posix");

View File

@ -222,8 +222,9 @@ public abstract class Policy {
public Policy run() { public Policy run() {
try { try {
ClassLoader scl = ClassLoader.getSystemClassLoader(); ClassLoader scl = ClassLoader.getSystemClassLoader();
Class<?> c = Class.forName(policyProvider, true, scl); @SuppressWarnings("deprecation")
return (Policy)c.newInstance(); Object o = Class.forName(policyProvider, true, scl).newInstance();
return (Policy)o;
} catch (Exception e) { } catch (Exception e) {
if (debug != null) { if (debug != null) {
debug.println("policy provider " + policyProvider + debug.println("policy provider " + policyProvider +

View File

@ -147,6 +147,7 @@ public abstract class ZoneRulesProvider {
if (prop != null) { if (prop != null) {
try { try {
Class<?> c = Class.forName(prop, true, ClassLoader.getSystemClassLoader()); Class<?> c = Class.forName(prop, true, ClassLoader.getSystemClassLoader());
@SuppressWarnings("deprecation")
ZoneRulesProvider provider = ZoneRulesProvider.class.cast(c.newInstance()); ZoneRulesProvider provider = ZoneRulesProvider.class.cast(c.newInstance());
registerProvider(provider); registerProvider(provider);
loaded.add(provider); loaded.add(provider);

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -4403,6 +4403,35 @@ public class Arrays {
public void sort(Comparator<? super E> c) { public void sort(Comparator<? super E> c) {
Arrays.sort(a, c); Arrays.sort(a, c);
} }
@Override
public Iterator<E> iterator() {
return new ArrayItr<>(a);
}
}
private static class ArrayItr<E> implements Iterator<E> {
private int cursor;
private final E[] a;
ArrayItr(E[] a) {
this.a = a;
}
@Override
public boolean hasNext() {
return cursor < a.length;
}
@Override
public E next() {
int i = cursor;
if (i >= a.length) {
throw new NoSuchElementException();
}
cursor = i + 1;
return a[i];
}
} }
/** /**

View File

@ -858,7 +858,7 @@ public final class Locale implements Cloneable, Serializable {
private static Locale initDefault() { private static Locale initDefault() {
String language, region, script, country, variant; String language, region, script, country, variant;
Properties props = GetPropertyAction.getProperties(); Properties props = GetPropertyAction.privilegedGetProperties();
language = props.getProperty("user.language", "en"); language = props.getProperty("user.language", "en");
// for compatibility, check for old user.region property // for compatibility, check for old user.region property
region = props.getProperty("user.region"); region = props.getProperty("user.region");
@ -883,7 +883,7 @@ public final class Locale implements Cloneable, Serializable {
} }
private static Locale initDefault(Locale.Category category) { private static Locale initDefault(Locale.Category category) {
Properties props = GetPropertyAction.getProperties(); Properties props = GetPropertyAction.privilegedGetProperties();
return getInstance( return getInstance(
props.getProperty(category.languageKey, props.getProperty(category.languageKey,
defaultLocale.getLanguage()), defaultLocale.getLanguage()),

View File

@ -140,9 +140,8 @@ public class PropertyResourceBundle extends ResourceBundle {
// Check whether the strict encoding is specified. // Check whether the strict encoding is specified.
// The possible encoding is either "ISO-8859-1" or "UTF-8". // The possible encoding is either "ISO-8859-1" or "UTF-8".
private static final String encoding = private static final String encoding = GetPropertyAction
GetPropertyAction .privilegedGetProperty("java.util.PropertyResourceBundle.encoding", "")
.getProperty("java.util.PropertyResourceBundle.encoding", "")
.toUpperCase(Locale.ROOT); .toUpperCase(Locale.ROOT);
/** /**

View File

@ -29,8 +29,6 @@ import java.io.BufferedReader;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.lang.module.ModuleDescriptor;
import java.lang.module.ModuleDescriptor.Provides;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Layer; import java.lang.reflect.Layer;
@ -85,7 +83,7 @@ import jdk.internal.reflect.Reflection;
* and deployed as a named module must have an appropriate <i>uses</i> clause * and deployed as a named module must have an appropriate <i>uses</i> clause
* in its <i>module descriptor</i> to declare that the module uses * in its <i>module descriptor</i> to declare that the module uses
* implementations of the service. A corresponding requirement is that a * implementations of the service. A corresponding requirement is that a
* provider deployed as a named modules must have an appropriate * provider deployed as a named module must have an appropriate
* <i>provides</i> clause in its module descriptor to declare that the module * <i>provides</i> clause in its module descriptor to declare that the module
* provides an implementation of the service. The <i>uses</i> and * provides an implementation of the service. The <i>uses</i> and
* <i>provides</i> allow consumers of a service to be <i>linked</i> to * <i>provides</i> allow consumers of a service to be <i>linked</i> to
@ -550,35 +548,29 @@ public final class ServiceLoader<S>
/** /**
* Implements lazy service provider lookup of service providers that * Implements lazy service provider lookup of service providers that
* are provided by modules in a module Layer. * are provided by modules in a module Layer.
*
* For now, this iterator examines all modules in each Layer. This will
* be replaced once we decide on how the service-use graph is exposed
* in the module API.
*/ */
private class LayerLookupIterator private class LayerLookupIterator
extends RestrictedIterator<S> extends RestrictedIterator<S>
{ {
final String serviceName; final String serviceName;
Layer currentLayer; Layer currentLayer;
Iterator<ModuleDescriptor> descriptorIterator; Iterator<ServiceProvider> iterator;
Iterator<String> providersIterator; ServiceProvider nextProvider;
Module nextModule;
String nextProvider;
LayerLookupIterator() { LayerLookupIterator() {
serviceName = service.getName(); serviceName = service.getName();
currentLayer = layer; currentLayer = layer;
// need to get us started // need to get us started
descriptorIterator = descriptors(layer, serviceName); iterator = providers(currentLayer, serviceName);
} }
Iterator<ModuleDescriptor> descriptors(Layer layer, String service) { Iterator<ServiceProvider> providers(Layer layer, String service) {
return layer.modules().stream() ServicesCatalog catalog = SharedSecrets
.map(Module::getDescriptor) .getJavaLangReflectModuleAccess()
.filter(d -> d.provides().get(service) != null) .getServicesCatalog(layer);
.iterator();
return catalog.findServices(serviceName).iterator();
} }
@Override @Override
@ -591,30 +583,18 @@ public final class ServiceLoader<S>
while (true) { while (true) {
// next provider // next provider
if (providersIterator != null && providersIterator.hasNext()) { if (iterator != null && iterator.hasNext()) {
nextProvider = providersIterator.next(); nextProvider = iterator.next();
return true; return true;
} }
// next descriptor
if (descriptorIterator.hasNext()) {
ModuleDescriptor descriptor = descriptorIterator.next();
nextModule = currentLayer.findModule(descriptor.name()).get();
Provides provides = descriptor.provides().get(serviceName);
providersIterator = provides.providers().iterator();
continue;
}
// next layer // next layer
Layer parent = currentLayer.parent().orElse(null); Layer parent = currentLayer.parent().orElse(null);
if (parent == null) if (parent == null)
return false; return false;
currentLayer = parent; currentLayer = parent;
descriptorIterator = descriptors(currentLayer, serviceName); iterator = providers(currentLayer, serviceName);
} }
} }
@ -623,13 +603,14 @@ public final class ServiceLoader<S>
if (!hasNextService()) if (!hasNextService())
throw new NoSuchElementException(); throw new NoSuchElementException();
assert nextModule != null && nextProvider != null; ServiceProvider provider = nextProvider;
String cn = nextProvider;
nextProvider = null; nextProvider = null;
Module module = provider.module();
String cn = provider.providerName();
// attempt to load the provider // attempt to load the provider
Class<?> c = loadClassInModule(nextModule, cn); Class<?> c = loadClassInModule(module, cn);
if (c == null) if (c == null)
fail(service, "Provider " + cn + " not found"); fail(service, "Provider " + cn + " not found");
if (!service.isAssignableFrom(c)) if (!service.isAssignableFrom(c))
@ -830,7 +811,9 @@ public final class ServiceLoader<S>
} }
S p = null; S p = null;
try { try {
p = service.cast(c.newInstance()); @SuppressWarnings("deprecation")
Object tmp = c.newInstance();
p = service.cast(tmp);
} catch (Throwable x) { } catch (Throwable x) {
fail(service, fail(service,
"Provider " + cn + " could not be instantiated", "Provider " + cn + " could not be instantiated",

View File

@ -42,6 +42,7 @@ import java.io.Serializable;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.time.ZoneId; import java.time.ZoneId;
import java.util.Properties;
import sun.security.action.GetPropertyAction; import sun.security.action.GetPropertyAction;
import sun.util.calendar.ZoneInfo; import sun.util.calendar.ZoneInfo;
import sun.util.calendar.ZoneInfoFile; import sun.util.calendar.ZoneInfoFile;
@ -660,12 +661,13 @@ public abstract class TimeZone implements Serializable, Cloneable {
private static synchronized TimeZone setDefaultZone() { private static synchronized TimeZone setDefaultZone() {
TimeZone tz; TimeZone tz;
// get the time zone ID from the system properties // get the time zone ID from the system properties
String zoneID = GetPropertyAction.getProperty("user.timezone"); Properties props = GetPropertyAction.privilegedGetProperties();
String zoneID = props.getProperty("user.timezone");
// if the time zone ID is not set (yet), perform the // if the time zone ID is not set (yet), perform the
// platform to Java time zone ID mapping. // platform to Java time zone ID mapping.
if (zoneID == null || zoneID.isEmpty()) { if (zoneID == null || zoneID.isEmpty()) {
String javaHome = GetPropertyAction.getProperty("java.home"); String javaHome = props.getProperty("java.home");
try { try {
zoneID = getSystemTimeZoneID(javaHome); zoneID = getSystemTimeZoneID(javaHome);
if (zoneID == null) { if (zoneID == null) {
@ -693,13 +695,7 @@ public abstract class TimeZone implements Serializable, Cloneable {
assert tz != null; assert tz != null;
final String id = zoneID; final String id = zoneID;
AccessController.doPrivileged(new PrivilegedAction<>() { props.setProperty("user.timezone", id);
@Override
public Void run() {
System.setProperty("user.timezone", id);
return null;
}
});
defaultTimeZone = tz; defaultTimeZone = tz;
return tz; return tz;

View File

@ -3507,6 +3507,7 @@ public class ForkJoinPool extends AbstractExecutorService {
* Creates and returns the common pool, respecting user settings * Creates and returns the common pool, respecting user settings
* specified via system properties. * specified via system properties.
*/ */
@SuppressWarnings("deprecation") // Class.newInstance
static ForkJoinPool makeCommonPool() { static ForkJoinPool makeCommonPool() {
int parallelism = -1; int parallelism = -1;
ForkJoinWorkerThreadFactory factory = null; ForkJoinWorkerThreadFactory factory = null;

View File

@ -155,7 +155,7 @@ class JarFile extends ZipFile {
BASE_VERSION = 8; // one less than lowest version for versioned entries BASE_VERSION = 8; // one less than lowest version for versioned entries
int runtimeVersion = jdk.Version.current().major(); int runtimeVersion = jdk.Version.current().major();
String jarVersion = String jarVersion =
GetPropertyAction.getProperty("jdk.util.jar.version"); GetPropertyAction.privilegedGetProperty("jdk.util.jar.version");
if (jarVersion != null) { if (jarVersion != null) {
int jarVer = Integer.parseInt(jarVersion); int jarVer = Integer.parseInt(jarVersion);
runtimeVersion = (jarVer > runtimeVersion) runtimeVersion = (jarVer > runtimeVersion)
@ -163,7 +163,7 @@ class JarFile extends ZipFile {
} }
RUNTIME_VERSION = runtimeVersion; RUNTIME_VERSION = runtimeVersion;
String enableMultiRelease = GetPropertyAction String enableMultiRelease = GetPropertyAction
.getProperty("jdk.util.jar.enableMultiRelease", "true"); .privilegedGetProperty("jdk.util.jar.enableMultiRelease", "true");
switch (enableMultiRelease) { switch (enableMultiRelease) {
case "true": case "true":
default: default:
@ -658,6 +658,28 @@ class JarFile extends ZipFile {
return vze == null ? ze : vze; return vze == null ? ze : vze;
} }
/**
* Returns the real name of a {@code JarEntry}. If this {@code JarFile} is
* a multi-release jar file and is configured to be processed as such, the
* name returned by this method is the path name of the versioned entry
* that the {@code JarEntry} represents, rather than the path name of the
* base entry that {@link JarEntry#getName()} returns. If the
* {@code JarEntry} does not represent a versioned entry, or the
* jar file is not a multi-release jar file or {@code JarFile} is not
* configured for processing a multi-release jar file, this method returns
* the same name that {@link JarEntry#getName()} returns.
*
* @param entry the JarEntry
* @return the real name of the JarEntry
* @since 9
*/
String getRealName(JarEntry entry) {
if (entry instanceof JarFileEntry) {
return ((JarFileEntry)entry).realName();
}
return entry.getName();
}
private class JarFileEntry extends JarEntry { private class JarFileEntry extends JarEntry {
final private String name; final private String name;
@ -684,7 +706,7 @@ class JarFile extends ZipFile {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
if (certs == null && jv != null) { if (certs == null && jv != null) {
certs = jv.getCerts(JarFile.this, reifiedEntry()); certs = jv.getCerts(JarFile.this, realEntry());
} }
return certs == null ? null : certs.clone(); return certs == null ? null : certs.clone();
} }
@ -695,17 +717,20 @@ class JarFile extends ZipFile {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
if (signers == null && jv != null) { if (signers == null && jv != null) {
signers = jv.getCodeSigners(JarFile.this, reifiedEntry()); signers = jv.getCodeSigners(JarFile.this, realEntry());
} }
return signers == null ? null : signers.clone(); return signers == null ? null : signers.clone();
} }
JarFileEntry reifiedEntry() { JarFileEntry realEntry() {
if (isMultiRelease()) { if (isMultiRelease()) {
String entryName = super.getName(); String entryName = super.getName();
return entryName.equals(this.name) ? this : new JarFileEntry(entryName, this); return entryName.equals(this.name) ? this : new JarFileEntry(entryName, this);
} }
return this; return this;
} }
String realName() {
return super.getName();
}
@Override @Override
public String getName() { public String getName() {
@ -876,11 +901,11 @@ class JarFile extends ZipFile {
private JarEntry verifiableEntry(ZipEntry ze) { private JarEntry verifiableEntry(ZipEntry ze) {
if (ze instanceof JarFileEntry) { if (ze instanceof JarFileEntry) {
// assure the name and entry match for verification // assure the name and entry match for verification
return ((JarFileEntry)ze).reifiedEntry(); return ((JarFileEntry)ze).realEntry();
} }
ze = getJarEntry(ze.getName()); ze = getJarEntry(ze.getName());
if (ze instanceof JarFileEntry) { if (ze instanceof JarFileEntry) {
return ((JarFileEntry)ze).reifiedEntry(); return ((JarFileEntry)ze).realEntry();
} }
return (JarEntry)ze; return (JarEntry)ze;
} }

View File

@ -60,4 +60,8 @@ class JavaUtilJarAccessImpl implements JavaUtilJarAccess {
public List<Object> getManifestDigests(JarFile jar) { public List<Object> getManifestDigests(JarFile jar) {
return jar.getManifestDigests(); return jar.getManifestDigests();
} }
public String getRealName(JarFile jar, JarEntry entry) {
return jar.getRealName(entry);
}
} }

View File

@ -695,7 +695,7 @@ public abstract class Pack200 {
Class<?> impl = (PACK_PROVIDER.equals(prop))? packerImpl: unpackerImpl; Class<?> impl = (PACK_PROVIDER.equals(prop))? packerImpl: unpackerImpl;
if (impl == null) { if (impl == null) {
// The first time, we must decide which class to use. // The first time, we must decide which class to use.
implName = GetPropertyAction.getProperty(prop,""); implName = GetPropertyAction.privilegedGetProperty(prop,"");
if (implName != null && !implName.equals("")) if (implName != null && !implName.equals(""))
impl = Class.forName(implName); impl = Class.forName(implName);
else if (PACK_PROVIDER.equals(prop)) else if (PACK_PROVIDER.equals(prop))
@ -704,7 +704,9 @@ public abstract class Pack200 {
impl = com.sun.java.util.jar.pack.UnpackerImpl.class; impl = com.sun.java.util.jar.pack.UnpackerImpl.class;
} }
// We have a class. Now instantiate it. // We have a class. Now instantiate it.
return impl.newInstance(); @SuppressWarnings("deprecation")
Object result = impl.newInstance();
return result;
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException e) {
throw new Error("Class not found: " + implName + throw new Error("Class not found: " + implName +
":\ncheck property " + prop + ":\ncheck property " + prop +

View File

@ -94,7 +94,7 @@ public class PatternSyntaxException
} }
private static final String nl = private static final String nl =
GetPropertyAction.getProperty("line.separator"); GetPropertyAction.privilegedGetProperty("line.separator");
/** /**
* Returns a multi-line string containing the description of the syntax * Returns a multi-line string containing the description of the syntax

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -167,6 +167,19 @@ abstract class DoublePipeline<E_IN>
return Nodes.doubleBuilder(exactSizeIfKnown); return Nodes.doubleBuilder(exactSizeIfKnown);
} }
private <U> Stream<U> mapToObj(DoubleFunction<? extends U> mapper, int opFlags) {
return new ReferencePipeline.StatelessOp<Double, U>(this, StreamShape.DOUBLE_VALUE, opFlags) {
@Override
Sink<Double> opWrapSink(int flags, Sink<U> sink) {
return new Sink.ChainedDouble<U>(sink) {
@Override
public void accept(double t) {
downstream.accept(mapper.apply(t));
}
};
}
};
}
// DoubleStream // DoubleStream
@ -184,7 +197,7 @@ abstract class DoublePipeline<E_IN>
@Override @Override
public final Stream<Double> boxed() { public final Stream<Double> boxed() {
return mapToObj(Double::valueOf); return mapToObj(Double::valueOf, 0);
} }
@Override @Override
@ -207,18 +220,7 @@ abstract class DoublePipeline<E_IN>
@Override @Override
public final <U> Stream<U> mapToObj(DoubleFunction<? extends U> mapper) { public final <U> Stream<U> mapToObj(DoubleFunction<? extends U> mapper) {
Objects.requireNonNull(mapper); Objects.requireNonNull(mapper);
return new ReferencePipeline.StatelessOp<Double, U>(this, StreamShape.DOUBLE_VALUE, return mapToObj(mapper, StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT);
StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
@Override
Sink<Double> opWrapSink(int flags, Sink<U> sink) {
return new Sink.ChainedDouble<U>(sink) {
@Override
public void accept(double t) {
downstream.accept(mapper.apply(t));
}
};
}
};
} }
@Override @Override

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -170,6 +170,19 @@ abstract class IntPipeline<E_IN>
return Nodes.intBuilder(exactSizeIfKnown); return Nodes.intBuilder(exactSizeIfKnown);
} }
private <U> Stream<U> mapToObj(IntFunction<? extends U> mapper, int opFlags) {
return new ReferencePipeline.StatelessOp<Integer, U>(this, StreamShape.INT_VALUE, opFlags) {
@Override
Sink<Integer> opWrapSink(int flags, Sink<U> sink) {
return new Sink.ChainedInt<U>(sink) {
@Override
public void accept(int t) {
downstream.accept(mapper.apply(t));
}
};
}
};
}
// IntStream // IntStream
@ -187,8 +200,7 @@ abstract class IntPipeline<E_IN>
@Override @Override
public final LongStream asLongStream() { public final LongStream asLongStream() {
return new LongPipeline.StatelessOp<Integer>(this, StreamShape.INT_VALUE, return new LongPipeline.StatelessOp<Integer>(this, StreamShape.INT_VALUE, 0) {
StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
@Override @Override
Sink<Integer> opWrapSink(int flags, Sink<Long> sink) { Sink<Integer> opWrapSink(int flags, Sink<Long> sink) {
return new Sink.ChainedInt<Long>(sink) { return new Sink.ChainedInt<Long>(sink) {
@ -203,8 +215,7 @@ abstract class IntPipeline<E_IN>
@Override @Override
public final DoubleStream asDoubleStream() { public final DoubleStream asDoubleStream() {
return new DoublePipeline.StatelessOp<Integer>(this, StreamShape.INT_VALUE, return new DoublePipeline.StatelessOp<Integer>(this, StreamShape.INT_VALUE, 0) {
StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
@Override @Override
Sink<Integer> opWrapSink(int flags, Sink<Double> sink) { Sink<Integer> opWrapSink(int flags, Sink<Double> sink) {
return new Sink.ChainedInt<Double>(sink) { return new Sink.ChainedInt<Double>(sink) {
@ -219,7 +230,7 @@ abstract class IntPipeline<E_IN>
@Override @Override
public final Stream<Integer> boxed() { public final Stream<Integer> boxed() {
return mapToObj(Integer::valueOf); return mapToObj(Integer::valueOf, 0);
} }
@Override @Override
@ -242,18 +253,7 @@ abstract class IntPipeline<E_IN>
@Override @Override
public final <U> Stream<U> mapToObj(IntFunction<? extends U> mapper) { public final <U> Stream<U> mapToObj(IntFunction<? extends U> mapper) {
Objects.requireNonNull(mapper); Objects.requireNonNull(mapper);
return new ReferencePipeline.StatelessOp<Integer, U>(this, StreamShape.INT_VALUE, return mapToObj(mapper, StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT);
StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
@Override
Sink<Integer> opWrapSink(int flags, Sink<U> sink) {
return new Sink.ChainedInt<U>(sink) {
@Override
public void accept(int t) {
downstream.accept(mapper.apply(t));
}
};
}
};
} }
@Override @Override

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2013, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -167,6 +167,19 @@ abstract class LongPipeline<E_IN>
return Nodes.longBuilder(exactSizeIfKnown); return Nodes.longBuilder(exactSizeIfKnown);
} }
private <U> Stream<U> mapToObj(LongFunction<? extends U> mapper, int opFlags) {
return new ReferencePipeline.StatelessOp<Long, U>(this, StreamShape.LONG_VALUE, opFlags) {
@Override
Sink<Long> opWrapSink(int flags, Sink<U> sink) {
return new Sink.ChainedLong<U>(sink) {
@Override
public void accept(long t) {
downstream.accept(mapper.apply(t));
}
};
}
};
}
// LongStream // LongStream
@ -184,8 +197,7 @@ abstract class LongPipeline<E_IN>
@Override @Override
public final DoubleStream asDoubleStream() { public final DoubleStream asDoubleStream() {
return new DoublePipeline.StatelessOp<Long>(this, StreamShape.LONG_VALUE, return new DoublePipeline.StatelessOp<Long>(this, StreamShape.LONG_VALUE, StreamOpFlag.NOT_DISTINCT) {
StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
@Override @Override
Sink<Long> opWrapSink(int flags, Sink<Double> sink) { Sink<Long> opWrapSink(int flags, Sink<Double> sink) {
return new Sink.ChainedLong<Double>(sink) { return new Sink.ChainedLong<Double>(sink) {
@ -200,7 +212,7 @@ abstract class LongPipeline<E_IN>
@Override @Override
public final Stream<Long> boxed() { public final Stream<Long> boxed() {
return mapToObj(Long::valueOf); return mapToObj(Long::valueOf, 0);
} }
@Override @Override
@ -223,18 +235,7 @@ abstract class LongPipeline<E_IN>
@Override @Override
public final <U> Stream<U> mapToObj(LongFunction<? extends U> mapper) { public final <U> Stream<U> mapToObj(LongFunction<? extends U> mapper) {
Objects.requireNonNull(mapper); Objects.requireNonNull(mapper);
return new ReferencePipeline.StatelessOp<Long, U>(this, StreamShape.LONG_VALUE, return mapToObj(mapper, StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT);
StreamOpFlag.NOT_SORTED | StreamOpFlag.NOT_DISTINCT) {
@Override
Sink<Long> opWrapSink(int flags, Sink<U> sink) {
return new Sink.ChainedLong<U>(sink) {
@Override
public void accept(long t) {
downstream.accept(mapper.apply(t));
}
};
}
};
} }
@Override @Override

View File

@ -28,6 +28,7 @@ import java.util.Comparator;
import java.util.Objects; import java.util.Objects;
import java.util.Spliterator; import java.util.Spliterator;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import java.util.function.BooleanSupplier; import java.util.function.BooleanSupplier;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -905,6 +906,7 @@ class StreamSpliterators {
// The spliterator to slice // The spliterator to slice
protected final T_SPLITR s; protected final T_SPLITR s;
protected final boolean unlimited; protected final boolean unlimited;
protected final int chunkSize;
private final long skipThreshold; private final long skipThreshold;
private final AtomicLong permits; private final AtomicLong permits;
@ -912,6 +914,8 @@ class StreamSpliterators {
this.s = s; this.s = s;
this.unlimited = limit < 0; this.unlimited = limit < 0;
this.skipThreshold = limit >= 0 ? limit : 0; this.skipThreshold = limit >= 0 ? limit : 0;
this.chunkSize = limit >= 0 ? (int)Math.min(CHUNK_SIZE,
((skip + limit) / AbstractTask.LEAF_TARGET) + 1) : CHUNK_SIZE;
this.permits = new AtomicLong(limit >= 0 ? skip + limit : skip); this.permits = new AtomicLong(limit >= 0 ? skip + limit : skip);
} }
@ -921,6 +925,7 @@ class StreamSpliterators {
this.unlimited = parent.unlimited; this.unlimited = parent.unlimited;
this.permits = parent.permits; this.permits = parent.permits;
this.skipThreshold = parent.skipThreshold; this.skipThreshold = parent.skipThreshold;
this.chunkSize = parent.chunkSize;
} }
/** /**
@ -1029,13 +1034,13 @@ class StreamSpliterators {
PermitStatus permitStatus; PermitStatus permitStatus;
while ((permitStatus = permitStatus()) != PermitStatus.NO_MORE) { while ((permitStatus = permitStatus()) != PermitStatus.NO_MORE) {
if (permitStatus == PermitStatus.MAYBE_MORE) { if (permitStatus == PermitStatus.MAYBE_MORE) {
// Optimistically traverse elements up to a threshold of CHUNK_SIZE // Optimistically traverse elements up to a threshold of chunkSize
if (sb == null) if (sb == null)
sb = new ArrayBuffer.OfRef<>(CHUNK_SIZE); sb = new ArrayBuffer.OfRef<>(chunkSize);
else else
sb.reset(); sb.reset();
long permitsRequested = 0; long permitsRequested = 0;
do { } while (s.tryAdvance(sb) && ++permitsRequested < CHUNK_SIZE); do { } while (s.tryAdvance(sb) && ++permitsRequested < chunkSize);
if (permitsRequested == 0) if (permitsRequested == 0)
return; return;
sb.forEach(action, acquirePermits(permitsRequested)); sb.forEach(action, acquirePermits(permitsRequested));
@ -1102,15 +1107,15 @@ class StreamSpliterators {
PermitStatus permitStatus; PermitStatus permitStatus;
while ((permitStatus = permitStatus()) != PermitStatus.NO_MORE) { while ((permitStatus = permitStatus()) != PermitStatus.NO_MORE) {
if (permitStatus == PermitStatus.MAYBE_MORE) { if (permitStatus == PermitStatus.MAYBE_MORE) {
// Optimistically traverse elements up to a threshold of CHUNK_SIZE // Optimistically traverse elements up to a threshold of chunkSize
if (sb == null) if (sb == null)
sb = bufferCreate(CHUNK_SIZE); sb = bufferCreate(chunkSize);
else else
sb.reset(); sb.reset();
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
T_CONS sbc = (T_CONS) sb; T_CONS sbc = (T_CONS) sb;
long permitsRequested = 0; long permitsRequested = 0;
do { } while (s.tryAdvance(sbc) && ++permitsRequested < CHUNK_SIZE); do { } while (s.tryAdvance(sbc) && ++permitsRequested < chunkSize);
if (permitsRequested == 0) if (permitsRequested == 0)
return; return;
sb.forEach(action, acquirePermits(permitsRequested)); sb.forEach(action, acquirePermits(permitsRequested));

View File

@ -55,7 +55,7 @@ class ZipOutputStream extends DeflaterOutputStream implements ZipConstants {
*/ */
private static final boolean inhibitZip64 = private static final boolean inhibitZip64 =
Boolean.parseBoolean( Boolean.parseBoolean(
GetPropertyAction.getProperty("jdk.util.zip.inhibitZip64")); GetPropertyAction.privilegedGetProperty("jdk.util.zip.inhibitZip64"));
private static class XEntry { private static class XEntry {
final ZipEntry entry; final ZipEntry entry;

View File

@ -97,6 +97,7 @@ public abstract class SSLServerSocketFactory extends ServerSocketFactory
} }
} }
log("class " + clsName + " is loaded"); log("class " + clsName + " is loaded");
@SuppressWarnings("deprecation")
SSLServerSocketFactory fac = (SSLServerSocketFactory)cls.newInstance(); SSLServerSocketFactory fac = (SSLServerSocketFactory)cls.newInstance();
log("instantiated an instance of class " + clsName); log("instantiated an instance of class " + clsName);
theFactory = fac; theFactory = fac;

View File

@ -51,7 +51,7 @@ public abstract class SSLSocketFactory extends SocketFactory
static final boolean DEBUG; static final boolean DEBUG;
static { static {
String s = GetPropertyAction.getProperty("javax.net.debug", "") String s = GetPropertyAction.privilegedGetProperty("javax.net.debug", "")
.toLowerCase(Locale.ENGLISH); .toLowerCase(Locale.ENGLISH);
DEBUG = s.contains("all") || s.contains("ssl"); DEBUG = s.contains("all") || s.contains("ssl");
@ -106,6 +106,7 @@ public abstract class SSLSocketFactory extends SocketFactory
} }
} }
log("class " + clsName + " is loaded"); log("class " + clsName + " is loaded");
@SuppressWarnings("deprecation")
SSLSocketFactory fac = (SSLSocketFactory)cls.newInstance(); SSLSocketFactory fac = (SSLSocketFactory)cls.newInstance();
log("instantiated an instance of class " + clsName); log("instantiated an instance of class " + clsName);
theFactory = fac; theFactory = fac;

View File

@ -250,7 +250,9 @@ public abstract class Configuration {
finalClass, false, finalClass, false,
Thread.currentThread().getContextClassLoader() Thread.currentThread().getContextClassLoader()
).asSubclass(Configuration.class); ).asSubclass(Configuration.class);
return implClass.newInstance(); @SuppressWarnings("deprecation")
Configuration result = implClass.newInstance();
return result;
} }
}); });
AccessController.doPrivileged( AccessController.doPrivileged(

View File

@ -304,7 +304,9 @@ public class LoginContext {
Class<? extends CallbackHandler> c = Class.forName( Class<? extends CallbackHandler> c = Class.forName(
defaultHandler, true, defaultHandler, true,
finalLoader).asSubclass(CallbackHandler.class); finalLoader).asSubclass(CallbackHandler.class);
return c.newInstance(); @SuppressWarnings("deprecation")
CallbackHandler result = c.newInstance();
return result;
} }
}); });
} catch (java.security.PrivilegedActionException pae) { } catch (java.security.PrivilegedActionException pae) {
@ -697,8 +699,9 @@ public class LoginContext {
if (moduleStack[i].module == null) { if (moduleStack[i].module == null) {
try { try {
moduleStack[i].module = (LoginModule) Class.forName( @SuppressWarnings("deprecation")
name, false, contextClassLoader).newInstance(); Object tmp = Class.forName(name, false, contextClassLoader).newInstance();
moduleStack[i].module = (LoginModule) tmp;
if (debug != null) { if (debug != null) {
debug.println(name + " loaded via reflection"); debug.println(name + " loaded via reflection");
} }

View File

@ -273,7 +273,8 @@ public final class Version
*/ */
public static Version current() { public static Version current() {
if (current == null) { if (current == null) {
current = parse(GetPropertyAction.getProperty("java.version")); current = parse(
GetPropertyAction.privilegedGetProperty("java.version"));
} }
return current; return current;
} }

View File

@ -124,7 +124,9 @@ public final class JrtFileSystemProvider extends FileSystemProvider {
ClassLoader cl = newJrtFsLoader(jrtfs); ClassLoader cl = newJrtFsLoader(jrtfs);
try { try {
Class<?> c = Class.forName(JrtFileSystemProvider.class.getName(), false, cl); Class<?> c = Class.forName(JrtFileSystemProvider.class.getName(), false, cl);
return ((FileSystemProvider)c.newInstance()).newFileSystem(uri, newEnv); @SuppressWarnings("deprecation")
Object tmp = c.newInstance();
return ((FileSystemProvider)tmp).newFileSystem(uri, newEnv);
} catch (ClassNotFoundException | } catch (ClassNotFoundException |
IllegalAccessException | IllegalAccessException |
InstantiationException e) { InstantiationException e) {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -68,7 +68,7 @@ public class BootLoader {
} }
// ServiceCatalog for the boot class loader // ServiceCatalog for the boot class loader
private static final ServicesCatalog SERVICES_CATALOG = new ServicesCatalog(); private static final ServicesCatalog SERVICES_CATALOG = ServicesCatalog.create();
// ClassLoaderValue map for boot class loader // ClassLoaderValue map for boot class loader
private static final ConcurrentHashMap<?, ?> CLASS_LOADER_VALUE_MAP = private static final ConcurrentHashMap<?, ?> CLASS_LOADER_VALUE_MAP =

View File

@ -104,7 +104,7 @@ public class BuiltinClassLoader
* A module defined/loaded by a built-in class loader. * A module defined/loaded by a built-in class loader.
* *
* A LoadedModule encapsulates a ModuleReference along with its CodeSource * A LoadedModule encapsulates a ModuleReference along with its CodeSource
* URL to avoid needing to create this URL when define classes. * URL to avoid needing to create this URL when defining classes.
*/ */
private static class LoadedModule { private static class LoadedModule {
private final BuiltinClassLoader loader; private final BuiltinClassLoader loader;

View File

@ -85,7 +85,7 @@ public class URLClassPath {
private static final boolean DISABLE_JAR_CHECKING; private static final boolean DISABLE_JAR_CHECKING;
static { static {
Properties props = GetPropertyAction.getProperties(); Properties props = GetPropertyAction.privilegedGetProperties();
JAVA_VERSION = props.getProperty("java.version"); JAVA_VERSION = props.getProperty("java.version");
DEBUG = (props.getProperty("sun.misc.URLClassPath.debug") != null); DEBUG = (props.getProperty("sun.misc.URLClassPath.debug") != null);
String p = props.getProperty("sun.misc.URLClassPath.disableJarChecking"); String p = props.getProperty("sun.misc.URLClassPath.disableJarChecking");
@ -372,9 +372,15 @@ public class URLClassPath {
return java.security.AccessController.doPrivileged( return java.security.AccessController.doPrivileged(
new java.security.PrivilegedExceptionAction<>() { new java.security.PrivilegedExceptionAction<>() {
public Loader run() throws IOException { public Loader run() throws IOException {
String protocol = url.getProtocol(); // lower cased in URL
String file = url.getFile(); String file = url.getFile();
if (file != null && file.endsWith("/")) { if ("jar".equals(protocol)
if ("file".equals(url.getProtocol())) { && file != null && (file.indexOf("!/") == file.length() - 2)) {
// extract the nested URL
URL nestedUrl = new URL(file.substring(0, file.length() - 2));
return new JarLoader(nestedUrl, jarHandler, lmap);
} else if (file != null && file.endsWith("/")) {
if ("file".equals(protocol)) {
return new FileLoader(url); return new FileLoader(url);
} else { } else {
return new Loader(url); return new Loader(url);
@ -718,13 +724,13 @@ public class URLClassPath {
final URL url; final URL url;
try { try {
String nm;
if (jar.isMultiRelease()) { if (jar.isMultiRelease()) {
// add #runtime fragment to tell JarURLConnection to use nm = SharedSecrets.javaUtilJarAccess().getRealName(jar, entry);
// runtime versioning if the underlying jar file is multi-release
url = new URL(getBaseURL(), ParseUtil.encodePath(name, false) + "#runtime");
} else { } else {
url = new URL(getBaseURL(), ParseUtil.encodePath(name, false)); nm = name;
} }
url = new URL(getBaseURL(), ParseUtil.encodePath(nm, false));
if (check) { if (check) {
URLClassPath.check(url); URLClassPath.check(url);
} }
@ -940,7 +946,8 @@ public class URLClassPath {
ensureOpen(); ensureOpen();
if (SharedSecrets.javaUtilJarAccess().jarFileHasClassPathAttribute(jar)) { // Only get manifest when necessary // Only get manifest when necessary
if (SharedSecrets.javaUtilJarAccess().jarFileHasClassPathAttribute(jar)) {
Manifest man = jar.getManifest(); Manifest man = jar.getManifest();
if (man != null) { if (man != null) {
Attributes attr = man.getMainAttributes(); Attributes attr = man.getMainAttributes();

View File

@ -81,7 +81,7 @@ public final class LoggerFinderLoader {
// Get configuration error policy // Get configuration error policy
private static ErrorPolicy configurationErrorPolicy() { private static ErrorPolicy configurationErrorPolicy() {
String errorPolicy = String errorPolicy =
GetPropertyAction.getProperty("jdk.logger.finder.error"); GetPropertyAction.privilegedGetProperty("jdk.logger.finder.error");
if (errorPolicy == null || errorPolicy.isEmpty()) { if (errorPolicy == null || errorPolicy.isEmpty()) {
return ErrorPolicy.WARNING; return ErrorPolicy.WARNING;
} }
@ -96,7 +96,7 @@ public final class LoggerFinderLoader {
// This is further submitted to the configuration error policy. // This is further submitted to the configuration error policy.
private static boolean ensureSingletonProvider() { private static boolean ensureSingletonProvider() {
return Boolean.parseBoolean( return Boolean.parseBoolean(
GetPropertyAction.getProperty("jdk.logger.finder.singleton")); GetPropertyAction.privilegedGetProperty("jdk.logger.finder.singleton"));
} }
private static Iterator<System.LoggerFinder> findLoggerFinderProviders() { private static Iterator<System.LoggerFinder> findLoggerFinderProviders() {

View File

@ -56,7 +56,7 @@ public class SimpleConsoleLogger extends LoggerConfiguration
static Level getDefaultLevel() { static Level getDefaultLevel() {
String levelName = GetPropertyAction String levelName = GetPropertyAction
.getProperty("jdk.system.logger.level", "INFO"); .privilegedGetProperty("jdk.system.logger.level", "INFO");
try { try {
return Level.valueOf(levelName); return Level.valueOf(levelName);
} catch (IllegalArgumentException iae) { } catch (IllegalArgumentException iae) {
@ -426,7 +426,7 @@ public class SimpleConsoleLogger extends LoggerConfiguration
static private final String[] skips; static private final String[] skips;
static { static {
String additionalPkgs = String additionalPkgs =
GetPropertyAction.getProperty("jdk.logger.packages"); GetPropertyAction.privilegedGetProperty("jdk.logger.packages");
skips = additionalPkgs == null ? new String[0] : additionalPkgs.split(","); skips = additionalPkgs == null ? new String[0] : additionalPkgs.split(",");
} }
@ -485,7 +485,7 @@ public class SimpleConsoleLogger extends LoggerConfiguration
// jdk/test/java/lang/invoke/lambda/LogGeneratedClassesTest.java // jdk/test/java/lang/invoke/lambda/LogGeneratedClassesTest.java
// to fail - because that test has a testcase which somehow references // to fail - because that test has a testcase which somehow references
// PlatformLogger and counts the number of generated lambda classes. // PlatformLogger and counts the number of generated lambda classes.
String format = GetPropertyAction.getProperty(key); String format = GetPropertyAction.privilegedGetProperty(key);
if (format == null && defaultPropertyGetter != null) { if (format == null && defaultPropertyGetter != null) {
format = defaultPropertyGetter.apply(key); format = defaultPropertyGetter.apply(key);

Some files were not shown because too many files have changed in this diff Show More