Skip to content

Commit 7c10b1d

Browse files
committed
Fix %c format with non-BMP characters
1 parent 81cabf1 commit 7c10b1d

File tree

2 files changed

+7
-2
lines changed

2 files changed

+7
-2
lines changed

graalpython/com.oracle.graal.python.test/src/tests/unittest_tags/test_unicode.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_format_huge_width
4848
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_format_map
4949
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_format_subclass
50+
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_formatting
5051
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_formatting_c_limits
5152
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_formatting_huge_precision
5253
*graalpython.lib-python.3.test.test_unicode.UnicodeTest.test_formatting_huge_precision_c_limits

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/formatting/StringFormatProcessor.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,19 @@ protected boolean useAsMapping(Object args1, PythonObjectLibrary lib, Object laz
6868
return !isString(args1, lazyClass) && isMapping(args1);
6969
}
7070

71+
private static boolean isOneCharacter(String str) {
72+
return str.length() == 1 || (str.length() == 2 && str.codePointCount(0, 2) == 1);
73+
}
74+
7175
@Override
7276
protected InternalFormat.Formatter handleSingleCharacterFormat(Spec spec) {
7377
InternalFormat.Formatter f;
7478
TextFormatter ft;
7579
Object arg = getArg();
76-
if (arg instanceof String && ((String) arg).length() == 1) {
80+
if (arg instanceof String && isOneCharacter((String) arg)) {
7781
f = ft = setupFormat(new TextFormatter(raiseNode, buffer, spec));
7882
ft.format((String) arg);
79-
} else if (arg instanceof PString && ((PString) arg).getValue().length() == 1) {
83+
} else if (arg instanceof PString && isOneCharacter(((PString) arg).getValue())) {
8084
f = ft = new TextFormatter(raiseNode, buffer, spec);
8185
ft.format(((PString) arg).getCharSequence());
8286
} else {

0 commit comments

Comments
 (0)