# HG changeset patch # User redestad # Date 1517223547 -3600 # Mon Jan 29 11:59:07 2018 +0100 # Node ID e23ef8a1de9b789d8531aab87f94bc27700cd129 # Parent d74e9dd04df6bddc8c3beff7421718bd69171541 8196331: Optimize Character.digit for latin1 input Reviewed-by: sherman diff --git a/make/data/characterdata/CharacterDataLatin1.java.template b/make/data/characterdata/CharacterDataLatin1.java.template --- a/make/data/characterdata/CharacterDataLatin1.java.template +++ b/make/data/characterdata/CharacterDataLatin1.java.template @@ -25,6 +25,8 @@ package java.lang; +import java.util.Arrays; + /** The CharacterData class encapsulates the large tables found in Java.lang.Character. */ @@ -159,20 +161,36 @@ return toUpperCase(ch); } + // Digit values for codePoints in the 0-255 range. Contents generated using: + // for (char i = 0; i < 256; i++) { + // int v = -1; + // if (i >= '0' && i <= '9') { v = i - '0'; } + // else if (i >= 'A' && i <= 'Z') { v = i - 'A' + 10; } + // else if (i >= 'a' && i <= 'z') { v = i - 'a' + 10; } + // if (i % 20 == 0) System.out.println(); + // System.out.printf("%2d, ", v); + // } + private static final byte[] DIGITS = new byte[] { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, + -1, -1, -1, -1, -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }; + int digit(int ch, int radix) { - int value = -1; - if (radix >= Character.MIN_RADIX && radix <= Character.MAX_RADIX) { - int val = getProperties(ch); - int kind = val & $$maskType; - if (kind == Character.DECIMAL_DIGIT_NUMBER) { - value = ch + ((val & $$maskDigitOffset) >> $$shiftDigitOffset) & $$maskDigit; - } - else if ((val & $$maskNumericType) == $$valueJavaSupradecimal) { - // Java supradecimal digit - value = (ch + ((val & $$maskDigitOffset) >> $$shiftDigitOffset) & $$maskDigit) + 10; - } + int value = DIGITS[ch]; + if (value >= 0 && radix >= Character.MIN_RADIX && radix <= Character.MAX_RADIX) { + value = (value < radix) ? value : -1; } - return (value < radix) ? value : -1; + return value; } int getNumericValue(int ch) {