# HG changeset patch # User redestad # Date 1500382645 -7200 # Tue Jul 18 14:57:25 2017 +0200 # Node ID 430194d1736dc94f4822c3a46b7a02637238c8ad # Parent 962144cb4baad7a706d7bac944e84c772c598b11 8184665: Skip name and alias checks for standard Charsets Reviewed-by: sherman, rriggs, forax diff --git a/src/java.base/share/classes/java/nio/charset/Charset.java b/src/java.base/share/classes/java/nio/charset/Charset.java --- a/src/java.base/share/classes/java/nio/charset/Charset.java +++ b/src/java.base/share/classes/java/nio/charset/Charset.java @@ -25,6 +25,11 @@ package java.nio.charset; +import jdk.internal.misc.VM; +import sun.nio.cs.StandardCharsets; +import sun.nio.cs.ThreadLocalCoders; +import sun.security.action.GetPropertyAction; + import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.charset.spi.CharsetProvider; @@ -38,15 +43,11 @@ import java.util.Map; import java.util.NoSuchElementException; import java.util.Objects; +import java.util.ServiceConfigurationError; +import java.util.ServiceLoader; import java.util.Set; -import java.util.ServiceLoader; -import java.util.ServiceConfigurationError; import java.util.SortedMap; import java.util.TreeMap; -import jdk.internal.misc.VM; -import sun.nio.cs.StandardCharsets; -import sun.nio.cs.ThreadLocalCoders; -import sun.security.action.GetPropertyAction; /** @@ -635,10 +636,19 @@ * If the canonical name or any of the aliases are illegal */ protected Charset(String canonicalName, String[] aliases) { - checkName(canonicalName); String[] as = Objects.requireNonNullElse(aliases, zeroAliases); - for (int i = 0; i < as.length; i++) - checkName(as[i]); + + // Skip checks for the standard, built-in Charsets we always load + // during initialization. Use of identity is intentional to be + // consistent with sun.nio.cs.StandardCharsets + if (canonicalName != StandardCharsets.ISO_8859_1 + && canonicalName != StandardCharsets.US_ASCII + && canonicalName != StandardCharsets.UTF_8) { + checkName(canonicalName); + for (int i = 0; i < as.length; i++) { + checkName(as[i]); + } + } this.name = canonicalName; this.aliases = as; } diff --git a/src/java.base/share/classes/sun/nio/cs/ISO_8859_1.java b/src/java.base/share/classes/sun/nio/cs/ISO_8859_1.java --- a/src/java.base/share/classes/sun/nio/cs/ISO_8859_1.java +++ b/src/java.base/share/classes/sun/nio/cs/ISO_8859_1.java @@ -42,7 +42,7 @@ { public ISO_8859_1() { - super("ISO-8859-1", StandardCharsets.aliases_ISO_8859_1); + super(StandardCharsets.ISO_8859_1, StandardCharsets.aliases_ISO_8859_1); } public String historicalName() { diff --git a/src/java.base/share/classes/sun/nio/cs/StandardCharsets.java.template b/src/java.base/share/classes/sun/nio/cs/StandardCharsets.java.template --- a/src/java.base/share/classes/sun/nio/cs/StandardCharsets.java.template +++ b/src/java.base/share/classes/sun/nio/cs/StandardCharsets.java.template @@ -51,6 +51,12 @@ private static final String packagePrefix = "sun.nio.cs"; + public static final String US_ASCII = "US-ASCII"; + + public static final String ISO_8859_1 = "ISO-8859-1"; + + public static final String UTF_8 = "UTF-8"; + public StandardCharsets() { this.aliasMap = new Aliases(); this.classMap = new Classes(); @@ -103,13 +109,13 @@ // As all charset class names added to classMap are string literals we // can check identity here as an optimization - if (cln == "US_ASCII") { + if (cln == US_ASCII) { return cache(csn, new US_ASCII()); } - if (cln == "ISO_8859_1") { + if (cln == ISO_8859_1) { return cache(csn, new ISO_8859_1()); } - if (cln == "UTF_8") { + if (cln == UTF_8) { return cache(csn, new UTF_8()); } diff --git a/src/java.base/share/classes/sun/nio/cs/US_ASCII.java b/src/java.base/share/classes/sun/nio/cs/US_ASCII.java --- a/src/java.base/share/classes/sun/nio/cs/US_ASCII.java +++ b/src/java.base/share/classes/sun/nio/cs/US_ASCII.java @@ -38,7 +38,7 @@ { public US_ASCII() { - super("US-ASCII", StandardCharsets.aliases_US_ASCII); + super(StandardCharsets.US_ASCII, StandardCharsets.aliases_US_ASCII); } public String historicalName() { diff --git a/src/java.base/share/classes/sun/nio/cs/UTF_8.java b/src/java.base/share/classes/sun/nio/cs/UTF_8.java --- a/src/java.base/share/classes/sun/nio/cs/UTF_8.java +++ b/src/java.base/share/classes/sun/nio/cs/UTF_8.java @@ -57,7 +57,7 @@ class UTF_8 extends Unicode { public UTF_8() { - super("UTF-8", StandardCharsets.aliases_UTF_8); + super(StandardCharsets.UTF_8, StandardCharsets.aliases_UTF_8); } public String historicalName() { diff --git a/test/java/nio/charset/Charset/IllegalCharsetName.java b/test/java/nio/charset/Charset/IllegalCharsetName.java --- a/test/java/nio/charset/Charset/IllegalCharsetName.java +++ b/test/java/nio/charset/Charset/IllegalCharsetName.java @@ -27,10 +27,7 @@ * if the charset names passed in are illegal. */ -import java.io.*; -import java.nio.*; import java.nio.charset.*; -import java.util.*; public class IllegalCharsetName { public static void main(String[] args) throws Exception { @@ -59,5 +56,18 @@ } catch (IllegalCharsetNameException x) { //expected } } + + // Standard charsets may bypass alias checking during startup, test that + // they're all well-behaved as a sanity test + checkAliases(StandardCharsets.ISO_8859_1); + checkAliases(StandardCharsets.US_ASCII); + checkAliases(StandardCharsets.UTF_8); + } + + private static void checkAliases(Charset cs) { + for (String alias : cs.aliases()) { + Charset.forName(alias); + Charset.isSupported(alias); + } } }