On Wed, 13 Sep 2023 01:24:05 GMT, Shaojin Wen <d...@openjdk.org> wrote:

> 1. Reduce duplicate stringSize code
> 2. Move java.lang.StringLatin1.getChars to 
> jdk.internal.util.DecimalDigits::getCharLatin1,not only java.lang, other 
> packages also need to use this method

Changes requested by liach (Author).

Changes requested by liach (Author).

Do Octal and Hex digits need int versions of getChars and stringSize?

Since the current `MethodHandle`-based char putter can only put 1-byte at once, 
have you considered something like this:

// A replacement for setter MethodHandle, or VarHandle, to accept multiple 
value types
public interface DigitConsumer {
    void putChar(byte[] array, int index, byte value);
    // put 2 byte-sized chars at once, encoded little endian
    void putChar2(byte[] array, int index, short value);
    // you can add putChar4, putChar8, etc. if you need
}

and `StringConcatHelper.selectPutChar` will return a `DigitConsumer` instead of 
a `MethodHandle`.

Currently, you are allocating a new byte array for every number in the format, 
which I deem very inefficient.

src/java.base/share/classes/java/util/FormatItem.java line 148:

> 146:             int length = DecimalDigits.stringSize(value);
> 147:             this.digits = new byte[length];
> 148:             DecimalDigits.getCharsLatin1(value, length, this.digits);

Sorry missed this one in last round of review. This is wrong if you mix number 
fornat items and chinese segments in a String Template.

src/java.base/share/classes/java/util/FormatItem.java line 248:

> 246:         public long prepend(long lengthCoder, byte[] buffer) throws 
> Throwable {
> 247:             MethodHandle putCharMH = selectPutChar(lengthCoder);
> 248:             HexDigits.getCharsLatin1(value, (int)lengthCoder, buffer);

This is wrong if the coder is UTF16

src/java.base/share/classes/java/util/FormatItem.java line 296:

> 294:         public long prepend(long lengthCoder, byte[] buffer) throws 
> Throwable {
> 295:             MethodHandle putCharMH = selectPutChar(lengthCoder);
> 296:             OctalDigits.getCharsLatin1(value, (int)lengthCoder, buffer);

Same, wrong for UTF16

src/java.base/share/classes/jdk/internal/util/DecimalDigits.java line 216:

> 214:      */
> 215:     public static int getCharsLatin1(int i, int index, byte[] buf) {
> 216:         // Used by trusted callers.  Assumes all necessary bounds checks 
> have been done by the caller.

Can you move this into the javadoc, like

<strong>Caller must ensure buf has enough capacity for the value to be 
written!</strong>

-------------

PR Review: https://git.openjdk.org/jdk/pull/15699#pullrequestreview-1623691652
PR Review: https://git.openjdk.org/jdk/pull/15699#pullrequestreview-1639167213
PR Comment: https://git.openjdk.org/jdk/pull/15699#issuecomment-1730795452
PR Comment: https://git.openjdk.org/jdk/pull/15699#issuecomment-1732267099
PR Review Comment: https://git.openjdk.org/jdk/pull/15699#discussion_r1334265520
PR Review Comment: https://git.openjdk.org/jdk/pull/15699#discussion_r1333894410
PR Review Comment: https://git.openjdk.org/jdk/pull/15699#discussion_r1333894660
PR Review Comment: https://git.openjdk.org/jdk/pull/15699#discussion_r1323970440

Reply via email to