Skip to content

Commit 89e884c

Browse files
committed
str.translate now process also non ASCII code
1 parent 3a3d2f1 commit 89e884c

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

graalpython/com.oracle.graal.python.test/src/tests/test_string.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -907,6 +907,19 @@ def test_translate_from_byte_table():
907907
assert "ahoj".translate(table) == "AHOJ"
908908
assert "ahoj".translate(bytearray(table)) == "AHOJ"
909909
assert "ahoj".translate(memoryview(table)) == "AHOJ"
910+
911+
def test_tranlslate_from_short_table():
912+
table = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`ABCDEFGH'
913+
assert "ahoj".translate(table) == "AHoj"
914+
915+
def test_translate_nonascii_from_byte_table():
916+
table = bytes.maketrans(bytes(string.ascii_lowercase, 'ascii'), bytes(string.ascii_uppercase, 'ascii'))
917+
assert "ačhřožj".translate(table) == "AčHřOžJ"
918+
919+
def test_translate_from_long_byte_table():
920+
table = bytes.maketrans(bytes(string.ascii_lowercase, 'ascii'), bytes(string.ascii_uppercase, 'ascii'))
921+
table *= 30
922+
assert 'ahoj453875287ščřžýáí'.translate(table) == 'AHOJ453875287A\rY~ýáí'
910923

911924
def test_splitlines():
912925
assert len(str.splitlines("\n\n")) == 2

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/str/StringBuiltins.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
import com.oracle.truffle.api.dsl.TypeSystemReference;
108108
import com.oracle.truffle.api.profiles.BranchProfile;
109109
import com.oracle.truffle.api.profiles.ConditionProfile;
110+
import java.nio.charset.StandardCharsets;
110111

111112
@CoreFunctions(extendClasses = PythonBuiltinClassType.PString)
112113
public final class StringBuiltins extends PythonBuiltins {
@@ -757,10 +758,15 @@ public String translate(String self, PDict table,
757758

758759
@TruffleBoundary
759760
private static String translateFromByteTable(String text, byte[] table) {
760-
byte[] translatedChars = text.getBytes();
761-
for (int i = 0; i < translatedChars.length; i++) {
762-
byte original = translatedChars[i];
763-
translatedChars[i] = table[original];
761+
char[] translatedChars = new char[text.length()];
762+
// convert only ascii or up to the lenght of table
763+
for (int i = 0; i < text.length(); i++) {
764+
char code = text.charAt(i);
765+
if (code < table.length) {
766+
translatedChars[i] = (char) (table[code] & 0xFF);
767+
} else {
768+
translatedChars[i] = code;
769+
}
764770
}
765771
return new String(translatedChars);
766772
}

0 commit comments

Comments
 (0)