8221430: StringBuffer(CharSequence) constructor truncates when -XX:-CompactStrings specified

Co-authored-by: Andrew Leonard <andrew_m_leonard@uk.ibm.com>
Reviewed-by: igerasim, rriggs
This commit is contained in:
Ivan Gerasimov 2019-04-09 16:32:22 -07:00
parent 758f02e6cc
commit eebe346715
5 changed files with 83 additions and 19 deletions

View file

@ -92,19 +92,57 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence {
}
/**
* Creates an AbstractStringBuilder with the specified coder and with
* the initial capacity equal to the smaller of (length + addition)
* and Integer.MAX_VALUE.
* Constructs an AbstractStringBuilder that contains the same characters
* as the specified {@code String}. The initial capacity of
* the string builder is {@code 16} plus the length of the
* {@code String} argument.
*
* @param str the string to copy.
*/
AbstractStringBuilder(byte coder, int length, int addition) {
AbstractStringBuilder(String str) {
int length = str.length();
int capacity = (length < Integer.MAX_VALUE - 16)
? length + 16 : Integer.MAX_VALUE;
final byte initCoder = str.coder();
coder = initCoder;
value = (initCoder == LATIN1)
? new byte[capacity] : StringUTF16.newBytesFor(capacity);
append(str);
}
/**
* Constructs an AbstractStringBuilder that contains the same characters
* as the specified {@code CharSequence}. The initial capacity of
* the string builder is {@code 16} plus the length of the
* {@code CharSequence} argument.
*
* @param seq the sequence to copy.
*/
AbstractStringBuilder(CharSequence seq) {
int length = seq.length();
if (length < 0) {
throw new NegativeArraySizeException("Negative length: " + length);
}
this.coder = coder;
int capacity = (length < Integer.MAX_VALUE - addition)
? length + addition : Integer.MAX_VALUE;
value = (coder == LATIN1)
int capacity = (length < Integer.MAX_VALUE - 16)
? length + 16 : Integer.MAX_VALUE;
final byte initCoder;
if (COMPACT_STRINGS) {
if (seq instanceof AbstractStringBuilder) {
initCoder = ((AbstractStringBuilder)seq).getCoder();
} else if (seq instanceof String) {
initCoder = ((String)seq).coder();
} else {
initCoder = LATIN1;
}
} else {
initCoder = UTF16;
}
coder = initCoder;
value = (initCoder == LATIN1)
? new byte[capacity] : StringUTF16.newBytesFor(capacity);
append(seq);
}
/**

View file

@ -148,8 +148,7 @@ import jdk.internal.HotSpotIntrinsicCandidate;
*/
@HotSpotIntrinsicCandidate
public StringBuffer(String str) {
super(str.coder(), str.length(), 16);
append(str);
super(str);
}
/**
@ -162,8 +161,7 @@ import jdk.internal.HotSpotIntrinsicCandidate;
* @since 1.5
*/
public StringBuffer(CharSequence seq) {
super(String.LATIN1, seq.length(), 16);
append(seq);
super(seq);
}
/**

View file

@ -121,8 +121,7 @@ public final class StringBuilder
*/
@HotSpotIntrinsicCandidate
public StringBuilder(String str) {
super(str.coder(), str.length(), 16);
append(str);
super(str);
}
/**
@ -134,8 +133,7 @@ public final class StringBuilder
* @param seq the sequence to copy.
*/
public StringBuilder(CharSequence seq) {
super(String.LATIN1, seq.length(), 16);
append(seq);
super(seq);
}
/**