On Fri, 13 Oct 2023 17:01:11 GMT, Shaojin Wen <[email protected]> wrote:
>> I submitted PR #15555 before, and there were too many changes. I split it
>> into multiple PRs with small changes. This one is one of them.
>>
>> this PR removed the duplicate code for getChars in
>> BigDecimal#StringBuilderHelper, i also make performance faster.
>> Please review and don't hesitate to critique my approach and patch.
>
> Shaojin Wen has updated the pull request incrementally with one additional
> commit since the last revision:
>
> use % calculate lowInt
Can I use StringConcatHelper.prepend? as follows:
static final class ConcatHelper {
static final MethodHandle STRING_PREPEND =
JLA.stringConcatHelper("prepend",
MethodType.methodType(long.class, long.class,
byte[].class, long.class));
static String scale2(long intCompact) {
long highInt = intCompact / 100;
int highIntSize = JLA.stringSize(highInt);
byte[] buf = new byte[highIntSize + 3];
try {
long coder = (long)
ConcatHelper.STRING_PREPEND.invokeExact((long) highIntSize, buf, highInt);
buf[highIntSize] = '.';
short pair = DecimalDigits.digitPair((int)(Math.abs(intCompact)
% 100));
buf[highIntSize + 1] = (byte)(pair & 0xff);
buf[highIntSize + 2] = (byte)(pair >> 8);
return JLA.newStringNoRepl(buf, StandardCharsets.ISO_8859_1);
} catch (Throwable e) {
throw new AssertionError(e);
}
}
}
private String layoutChars(boolean sci) {
int scale = this.scale;
long intCompact = this.intCompact;
if (scale == 0) // zero scale is trivial
return unscaledString();
if (scale == 2 && intCompact != INFLATED) {
// currency fast path
return ConcatHelper.scale2(intCompact);
}
// ...
}
-------------
PR Comment: https://git.openjdk.org/jdk/pull/16006#issuecomment-1763523085