# HG changeset patch # User thartmann # Date 1448613453 -3600 # Node ID c6e795a80c80845a7b2376cdc4c785132553a468 # Parent 1b8b4b0b160800cd8efddf085688477159de43a3 8142303: C2 compilation fails with "bad AD file" Summary: Move range checks into intrinsics for String methods. Reviewed-by: kvn, aph diff -r 1b8b4b0b1608 -r c6e795a80c80 jdk/src/java.base/share/classes/java/lang/AbstractStringBuilder.java --- a/jdk/src/java.base/share/classes/java/lang/AbstractStringBuilder.java Mon Nov 23 11:07:36 2015 +0100 +++ b/jdk/src/java.base/share/classes/java/lang/AbstractStringBuilder.java Fri Nov 27 09:37:33 2015 +0100 @@ -177,7 +177,7 @@ return; } byte[] buf = StringUTF16.newBytesFor(value.length); - StringLatin1.inflateSB(value, buf, 0, count); + StringLatin1.inflate(value, 0, buf, 0, count); this.value = buf; this.coder = UTF16; } @@ -414,9 +414,9 @@ int n = srcEnd - srcBegin; checkRange(dstBegin, dstBegin + n, dst.length); if (isLatin1()) { - StringLatin1.getCharsSB(value, srcBegin, srcEnd, dst, dstBegin); + StringLatin1.getChars(value, srcBegin, srcEnd, dst, dstBegin); } else { - StringUTF16.getCharsSB(value, srcBegin, srcEnd, dst, dstBegin); + StringUTF16.getChars(value, srcBegin, srcEnd, dst, dstBegin); } } @@ -992,7 +992,7 @@ if (isLatin1()) { return StringLatin1.newString(value, start, end - start); } - return StringUTF16.newStringSB(value, start, end - start); + return StringUTF16.newString(value, start, end - start); } private void shift(int offset, int n) { @@ -1588,7 +1588,7 @@ if (this.coder == coder) { System.arraycopy(value, 0, dst, dstBegin << coder, count << coder); } else { // this.coder == LATIN && coder == UTF16 - StringLatin1.inflateSB(value, dst, dstBegin, count); + StringLatin1.inflate(value, 0, dst, dstBegin, count); } } @@ -1653,10 +1653,7 @@ if (getCoder() != str.coder()) { inflate(); } - byte[] val = this.value; - byte coder = this.coder; - checkOffset(index + str.length(), val.length >> coder); - str.getBytes(val, index, coder); + str.getBytes(value, index, coder); } private final void appendChars(char[] s, int off, int end) { diff -r 1b8b4b0b1608 -r c6e795a80c80 jdk/src/java.base/share/classes/java/lang/String.java --- a/jdk/src/java.base/share/classes/java/lang/String.java Mon Nov 23 11:07:36 2015 +0100 +++ b/jdk/src/java.base/share/classes/java/lang/String.java Fri Nov 27 09:37:33 2015 +0100 @@ -1720,7 +1720,6 @@ */ static int indexOf(byte[] src, byte srcCoder, int srcCount, String tgtStr, int fromIndex) { - byte[] tgt = tgtStr.value; byte tgtCoder = tgtStr.coder(); int tgtCount = tgtStr.length(); @@ -3103,7 +3102,7 @@ * If {@code offset} is negative, {@code count} is negative, * or {@code offset} is greater than {@code length - count} */ - private static void checkBoundsOffCount(int offset, int count, int length) { + static void checkBoundsOffCount(int offset, int count, int length) { if (offset < 0 || count < 0 || offset > length - count) { throw new StringIndexOutOfBoundsException( "offset " + offset + ", count " + count + ", length " + length); diff -r 1b8b4b0b1608 -r c6e795a80c80 jdk/src/java.base/share/classes/java/lang/StringBuilder.java --- a/jdk/src/java.base/share/classes/java/lang/StringBuilder.java Mon Nov 23 11:07:36 2015 +0100 +++ b/jdk/src/java.base/share/classes/java/lang/StringBuilder.java Fri Nov 27 09:37:33 2015 +0100 @@ -413,7 +413,7 @@ public String toString() { // Create a copy, don't share the array return isLatin1() ? StringLatin1.newString(value, 0, count) - : StringUTF16.newStringSB(value, 0, count); + : StringUTF16.newString(value, 0, count); } /** diff -r 1b8b4b0b1608 -r c6e795a80c80 jdk/src/java.base/share/classes/java/lang/StringLatin1.java --- a/jdk/src/java.base/share/classes/java/lang/StringLatin1.java Mon Nov 23 11:07:36 2015 +0100 +++ b/jdk/src/java.base/share/classes/java/lang/StringLatin1.java Fri Nov 27 09:37:33 2015 +0100 @@ -36,6 +36,7 @@ import static java.lang.String.LATIN1; import static java.lang.String.UTF16; import static java.lang.String.checkOffset; +import static java.lang.String.checkBoundsOffCount; final class StringLatin1 { @@ -523,6 +524,8 @@ // inflatedCopy byte[] -> byte[] @HotSpotIntrinsicCandidate public static void inflate(byte[] src, int srcOff, byte[] dst, int dstOff, int len) { + // We need a range check here because 'putChar' has no checks + checkBoundsOffCount(dstOff, len, dst.length); for (int i = 0; i < len; i++) { StringUTF16.putChar(dst, dstOff++, src[srcOff++] & 0xff); } @@ -584,17 +587,4 @@ return cs; } } - - //////////////////////////////////////////////////////////////// - - public static void getCharsSB(byte[] val, int srcBegin, int srcEnd, char dst[], int dstBegin) { - checkOffset(srcEnd, val.length); - getChars(val, srcBegin, srcEnd, dst, dstBegin); - } - - public static void inflateSB(byte[] val, byte[] dst, int dstOff, int count) { - checkOffset(count, val.length); - checkOffset(dstOff + count, dst.length >> 1); // dst is utf16 - inflate(val, 0, dst, dstOff, count); - } } diff -r 1b8b4b0b1608 -r c6e795a80c80 jdk/src/java.base/share/classes/java/lang/StringUTF16.java --- a/jdk/src/java.base/share/classes/java/lang/StringUTF16.java Mon Nov 23 11:07:36 2015 +0100 +++ b/jdk/src/java.base/share/classes/java/lang/StringUTF16.java Fri Nov 27 09:37:33 2015 +0100 @@ -35,6 +35,7 @@ import static java.lang.String.LATIN1; import static java.lang.String.checkIndex; import static java.lang.String.checkOffset; +import static java.lang.String.checkBoundsOffCount; final class StringUTF16 { @@ -156,6 +157,8 @@ // compressedCopy byte[] -> byte[] @HotSpotIntrinsicCandidate public static int compress(byte[] src, int srcOff, byte[] dst, int dstOff, int len) { + // We need a range check here because 'getChar' has no checks + checkBoundsOffCount(srcOff, len, src.length); for (int i = 0; i < len; i++) { int c = getChar(src, srcOff++); if (c >>> 8 != 0) { @@ -200,6 +203,8 @@ @HotSpotIntrinsicCandidate public static void getChars(byte[] value, int srcBegin, int srcEnd, char dst[], int dstBegin) { + // We need a range check here because 'getChar' has no checks + checkBoundsOffCount(srcBegin, srcEnd - srcBegin, value.length); for (int i = srcBegin; i < srcEnd; i++) { dst[dstBegin++] = getChar(value, i); } @@ -909,11 +914,6 @@ //////////////////////////////////////////////////////////////// - public static void getCharsSB(byte[] val, int srcBegin, int srcEnd, char dst[], int dstBegin) { - checkOffset(srcEnd, val.length >> 1); - getChars(val, srcBegin, srcEnd, dst, dstBegin); - } - public static void putCharSB(byte[] val, int index, int c) { checkIndex(index, val.length >> 1); putChar(val, index, c); @@ -946,11 +946,6 @@ return codePointCount(val, beginIndex, endIndex); } - public static String newStringSB(byte[] val, int index, int len) { - checkOffset(index + len, val.length >> 1); - return newString(val, index, len); - } - //////////////////////////////////////////////////////////////// private static native boolean isBigEndian();