25
26 package java.lang;
27
28 import java.io.UnsupportedEncodingException;
29 import java.lang.ref.SoftReference;
30 import java.nio.ByteBuffer;
31 import java.nio.CharBuffer;
32 import java.nio.charset.Charset;
33 import java.nio.charset.CharsetDecoder;
34 import java.nio.charset.CharsetEncoder;
35 import java.nio.charset.CharacterCodingException;
36 import java.nio.charset.CoderResult;
37 import java.nio.charset.CodingErrorAction;
38 import java.nio.charset.IllegalCharsetNameException;
39 import java.nio.charset.UnsupportedCharsetException;
40 import java.util.Arrays;
41 import jdk.internal.HotSpotIntrinsicCandidate;
42 import sun.nio.cs.HistoricallyNamedCharset;
43 import sun.nio.cs.ArrayDecoder;
44 import sun.nio.cs.ArrayEncoder;
45 import sun.nio.cs.StandardCharsets;
46
47 import static java.lang.String.LATIN1;
48 import static java.lang.String.UTF16;
49 import static java.lang.String.COMPACT_STRINGS;
50 import static java.lang.Character.isSurrogate;
51 import static java.lang.Character.highSurrogate;
52 import static java.lang.Character.lowSurrogate;
53 import static java.lang.Character.isSupplementaryCodePoint;
54 import static java.lang.StringUTF16.putChar;
55 import static java.nio.charset.StandardCharsets.ISO_8859_1;
56 import static java.nio.charset.StandardCharsets.US_ASCII;
57 import static java.nio.charset.StandardCharsets.UTF_8;
58
59 /**
60 * Utility class for string encoding and decoding.
61 */
62
63 class StringCoding {
64
65 private StringCoding() { }
66
67 /** The cached coders for each thread */
68 private static final ThreadLocal<SoftReference<StringDecoder>> decoder =
69 new ThreadLocal<>();
70 private static final ThreadLocal<SoftReference<StringEncoder>> encoder =
71 new ThreadLocal<>();
72
73 private static <T> T deref(ThreadLocal<SoftReference<T>> tl) {
74 SoftReference<T> sr = tl.get();
75 if (sr == null)
76 return null;
77 return sr.get();
78 }
79
80 private static <T> void set(ThreadLocal<SoftReference<T>> tl, T ob) {
81 tl.set(new SoftReference<>(ob));
82 }
83
84 // Trim the given byte array to the given length
85 private static byte[] safeTrim(byte[] ba, int len, boolean isTrusted) {
86 if (len == ba.length && (isTrusted || System.getSecurityManager() == null))
87 return ba;
88 else
89 return Arrays.copyOf(ba, len);
90 }
91
|
25
26 package java.lang;
27
28 import java.io.UnsupportedEncodingException;
29 import java.lang.ref.SoftReference;
30 import java.nio.ByteBuffer;
31 import java.nio.CharBuffer;
32 import java.nio.charset.Charset;
33 import java.nio.charset.CharsetDecoder;
34 import java.nio.charset.CharsetEncoder;
35 import java.nio.charset.CharacterCodingException;
36 import java.nio.charset.CoderResult;
37 import java.nio.charset.CodingErrorAction;
38 import java.nio.charset.IllegalCharsetNameException;
39 import java.nio.charset.UnsupportedCharsetException;
40 import java.util.Arrays;
41 import jdk.internal.HotSpotIntrinsicCandidate;
42 import sun.nio.cs.HistoricallyNamedCharset;
43 import sun.nio.cs.ArrayDecoder;
44 import sun.nio.cs.ArrayEncoder;
45
46 import static java.lang.String.LATIN1;
47 import static java.lang.String.UTF16;
48 import static java.lang.String.COMPACT_STRINGS;
49 import static java.lang.Character.isSurrogate;
50 import static java.lang.Character.highSurrogate;
51 import static java.lang.Character.lowSurrogate;
52 import static java.lang.Character.isSupplementaryCodePoint;
53 import static java.lang.StringUTF16.putChar;
54
55 /**
56 * Utility class for string encoding and decoding.
57 */
58
59 class StringCoding {
60
61 private StringCoding() { }
62
63 /** The cached coders for each thread */
64 private static final ThreadLocal<SoftReference<StringDecoder>> decoder =
65 new ThreadLocal<>();
66 private static final ThreadLocal<SoftReference<StringEncoder>> encoder =
67 new ThreadLocal<>();
68
69 private static final Charset ISO_8859_1 = sun.nio.cs.ISO_8859_1.INSTANCE;
70 private static final Charset US_ASCII = sun.nio.cs.US_ASCII.INSTANCE;
71 private static final Charset UTF_8 = sun.nio.cs.UTF_8.INSTANCE;
72
73 private static <T> T deref(ThreadLocal<SoftReference<T>> tl) {
74 SoftReference<T> sr = tl.get();
75 if (sr == null)
76 return null;
77 return sr.get();
78 }
79
80 private static <T> void set(ThreadLocal<SoftReference<T>> tl, T ob) {
81 tl.set(new SoftReference<>(ob));
82 }
83
84 // Trim the given byte array to the given length
85 private static byte[] safeTrim(byte[] ba, int len, boolean isTrusted) {
86 if (len == ba.length && (isTrusted || System.getSecurityManager() == null))
87 return ba;
88 else
89 return Arrays.copyOf(ba, len);
90 }
91
|