Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 6 additions & 38 deletions src/java.base/share/classes/java/lang/Integer.java
Original file line number Diff line number Diff line change
Expand Up @@ -363,15 +363,9 @@ private static String toUnsignedString0(int val, int shift) {
// assert shift > 0 && shift <=5 : "Illegal shift value";
int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val);
int chars = Math.max(((mag + (shift - 1)) / shift), 1);
if (COMPACT_STRINGS) {
byte[] buf = new byte[chars];
formatUnsignedInt(val, shift, buf, chars);
return new String(buf, LATIN1);
} else {
byte[] buf = new byte[chars * 2];
formatUnsignedIntUTF16(val, shift, buf, chars);
return new String(buf, UTF16);
}
byte[] buf = new byte[chars];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the array size be chars*2 in when compact strings is not in use?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is no need to handle the case where COMPACT_STRING false is used, as it is inflate in java.lang.String#newStringWithLatin1Bytes.

formatUnsignedInt(val, shift, buf, chars);
return String.newStringWithLatin1Bytes(buf);
}

/**
Expand All @@ -394,26 +388,6 @@ private static void formatUnsignedInt(int val, int shift, byte[] buf, int len) {
} while (charPos > 0);
}

/**
* Format an {@code int} (treated as unsigned) into a byte buffer (UTF16 version). If
* {@code len} exceeds the formatted ASCII representation of {@code val},
* {@code buf} will be padded with leading zeroes.
*
* @param val the unsigned int to format
* @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary)
* @param buf the byte buffer to write to
* @param len the number of characters to write
*/
private static void formatUnsignedIntUTF16(int val, int shift, byte[] buf, int len) {
int charPos = len;
int radix = 1 << shift;
int mask = radix - 1;
do {
StringUTF16.putChar(buf, --charPos, Integer.digits[val & mask]);
val >>>= shift;
} while (charPos > 0);
}

/**
* Returns a {@code String} object representing the
* specified integer. The argument is converted to signed decimal
Expand All @@ -427,15 +401,9 @@ private static void formatUnsignedIntUTF16(int val, int shift, byte[] buf, int l
@IntrinsicCandidate
public static String toString(int i) {
int size = DecimalDigits.stringSize(i);
if (COMPACT_STRINGS) {
byte[] buf = new byte[size];
DecimalDigits.uncheckedGetCharsLatin1(i, size, buf);
return new String(buf, LATIN1);
} else {
byte[] buf = new byte[size * 2];
DecimalDigits.uncheckedGetCharsUTF16(i, size, buf);
return new String(buf, UTF16);
}
byte[] buf = new byte[size];
DecimalDigits.uncheckedGetCharsLatin1(i, size, buf);
return String.newStringWithLatin1Bytes(buf);
}

/**
Expand Down
45 changes: 6 additions & 39 deletions src/java.base/share/classes/java/lang/Long.java
Original file line number Diff line number Diff line change
Expand Up @@ -391,15 +391,9 @@ static String toUnsignedString0(long val, int shift) {
// assert shift > 0 && shift <=5 : "Illegal shift value";
int mag = Long.SIZE - Long.numberOfLeadingZeros(val);
int chars = Math.max(((mag + (shift - 1)) / shift), 1);
if (COMPACT_STRINGS) {
byte[] buf = new byte[chars];
formatUnsignedLong0(val, shift, buf, 0, chars);
return new String(buf, LATIN1);
} else {
byte[] buf = new byte[chars * 2];
formatUnsignedLong0UTF16(val, shift, buf, 0, chars);
return new String(buf, UTF16);
}
byte[] buf = new byte[chars];
formatUnsignedLong0(val, shift, buf, 0, chars);
return String.newStringWithLatin1Bytes(buf);
}

/**
Expand All @@ -423,27 +417,6 @@ private static void formatUnsignedLong0(long val, int shift, byte[] buf, int off
} while (charPos > offset);
}

/**
* Format a long (treated as unsigned) into a byte buffer (UTF16 version). If
* {@code len} exceeds the formatted ASCII representation of {@code val},
* {@code buf} will be padded with leading zeroes.
*
* @param val the unsigned long to format
* @param shift the log2 of the base to format in (4 for hex, 3 for octal, 1 for binary)
* @param buf the byte buffer to write to
* @param offset the offset in the destination buffer to start at
* @param len the number of characters to write
*/
private static void formatUnsignedLong0UTF16(long val, int shift, byte[] buf, int offset, int len) {
int charPos = offset + len;
int radix = 1 << shift;
int mask = radix - 1;
do {
StringUTF16.putChar(buf, --charPos, Integer.digits[((int) val) & mask]);
val >>>= shift;
} while (charPos > offset);
}

/**
* Returns a {@code String} object representing the specified
* {@code long}. The argument is converted to signed decimal
Expand All @@ -456,15 +429,9 @@ private static void formatUnsignedLong0UTF16(long val, int shift, byte[] buf, in
*/
public static String toString(long i) {
int size = DecimalDigits.stringSize(i);
if (COMPACT_STRINGS) {
byte[] buf = new byte[size];
DecimalDigits.uncheckedGetCharsLatin1(i, size, buf);
return new String(buf, LATIN1);
} else {
byte[] buf = new byte[size * 2];
DecimalDigits.uncheckedGetCharsUTF16(i, size, buf);
return new String(buf, UTF16);
}
byte[] buf = new byte[size];
DecimalDigits.uncheckedGetCharsLatin1(i, size, buf);
return String.newStringWithLatin1Bytes(buf);
}

/**
Expand Down