diff options
-rw-r--r-- | luni/src/main/java/java/lang/Character.java | 23 | ||||
-rw-r--r-- | luni/src/main/native/java_lang_Character.cpp | 4 | ||||
-rw-r--r-- | luni/src/test/java/libcore/java/lang/CharacterTest.java | 12 |
3 files changed, 27 insertions, 12 deletions
diff --git a/luni/src/main/java/java/lang/Character.java b/luni/src/main/java/java/lang/Character.java index 8efd6cd..e920a3e 100644 --- a/luni/src/main/java/java/lang/Character.java +++ b/luni/src/main/java/java/lang/Character.java @@ -2530,25 +2530,28 @@ public final class Character implements Serializable, Comparable<Character> { } /** - * Gets the Unicode directionality of the specified character. - * - * @param codePoint - * the Unicode code point to get the directionality of. - * @return the Unicode directionality of {@code codePoint}. + * Returns the Unicode directionality of the given code point. + * This will be one of the {@code DIRECTIONALITY_} constants. + * For characters whose directionality is undefined, or whose + * directionality has no appropriate constant in this class, + * {@code DIRECTIONALITY_UNDEFINED} is returned. */ public static byte getDirectionality(int codePoint) { if (getType(codePoint) == Character.UNASSIGNED) { return Character.DIRECTIONALITY_UNDEFINED; } - byte directionality = getDirectionalityImpl(codePoint); - if (directionality == -1) { - return -1; + byte directionality = getIcuDirectionality(codePoint); + if (directionality >= 0 && directionality < DIRECTIONALITY.length) { + return DIRECTIONALITY[directionality]; } - return DIRECTIONALITY[directionality]; + return Character.DIRECTIONALITY_UNDEFINED; } - private static native byte getDirectionalityImpl(int codePoint); + /** + * @hide - internal use only. + */ + public static native byte getIcuDirectionality(int codePoint); /** * Indicates whether the specified character is mirrored. diff --git a/luni/src/main/native/java_lang_Character.cpp b/luni/src/main/native/java_lang_Character.cpp index 2d1fcfc..4022f4b 100644 --- a/luni/src/main/native/java_lang_Character.cpp +++ b/luni/src/main/native/java_lang_Character.cpp @@ -33,7 +33,7 @@ static jint Character_getTypeImpl(JNIEnv*, jclass, jint codePoint) { return u_charType(codePoint); } -static jbyte Character_getDirectionalityImpl(JNIEnv*, jclass, jint codePoint) { +static jbyte Character_getIcuDirectionality(JNIEnv*, jclass, jint codePoint) { return u_charDirection(codePoint); } @@ -166,7 +166,7 @@ static jboolean Character_isIdeographic(JNIEnv*, jclass, jint codePoint) { static JNINativeMethod gMethods[] = { NATIVE_METHOD(Character, digitImpl, "!(II)I"), - NATIVE_METHOD(Character, getDirectionalityImpl, "!(I)B"), + NATIVE_METHOD(Character, getIcuDirectionality, "!(I)B"), NATIVE_METHOD(Character, getNameImpl, "(I)Ljava/lang/String;"), NATIVE_METHOD(Character, getNumericValueImpl, "!(I)I"), NATIVE_METHOD(Character, getTypeImpl, "!(I)I"), diff --git a/luni/src/test/java/libcore/java/lang/CharacterTest.java b/luni/src/test/java/libcore/java/lang/CharacterTest.java index 94e3b96..8c6f06f 100644 --- a/luni/src/test/java/libcore/java/lang/CharacterTest.java +++ b/luni/src/test/java/libcore/java/lang/CharacterTest.java @@ -277,4 +277,16 @@ public class CharacterTest extends junit.framework.TestCase { } } } + + // http://b/15492712 + public void test_getDirectionality() throws Exception { + // We shouldn't throw an exception for any code point. + for (int c = '\u0000'; c <= Character.MAX_VALUE; ++c) { + Character.getDirectionality(c); + } + assertEquals(Character.DIRECTIONALITY_UNDEFINED, Character.getDirectionality(0x2066)); + assertEquals(Character.DIRECTIONALITY_UNDEFINED, Character.getDirectionality(0x2067)); + assertEquals(Character.DIRECTIONALITY_UNDEFINED, Character.getDirectionality(0x2068)); + assertEquals(Character.DIRECTIONALITY_UNDEFINED, Character.getDirectionality(0x2069)); + } } |