Skip to content

Commit 0d45be9

Browse files
committed
[GR-13505] string.translate() doesn't work as expected.
1 parent 5216c21 commit 0d45be9

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
# Copyright (c) 2018, Oracle and/or its affiliates.
1+
# Copyright (c) 2018, 2019, Oracle and/or its affiliates.
22
# Copyright (C) 1996-2017 Python Software Foundation
33
#
44
# Licensed under the PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
55
import unittest
6-
6+
import string
77
import sys
88

99

@@ -902,6 +902,11 @@ def test_translate():
902902
else:
903903
assert False, "should raise"
904904

905+
def test_translate_from_byte_table():
906+
table = bytes.maketrans(bytes(string.ascii_lowercase, 'ascii'), bytes(string.ascii_uppercase, 'ascii'))
907+
assert "ahoj".translate(table) == "AHOJ"
908+
assert "ahoj".translate(bytearray(table)) == "AHOJ"
909+
assert "ahoj".translate(memoryview(table)) == "AHOJ"
905910

906911
def test_splitlines():
907912
assert len(str.splitlines("\n\n")) == 2

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,16 @@
6464
import com.oracle.graal.python.builtins.PythonBuiltins;
6565
import com.oracle.graal.python.builtins.objects.PNone;
6666
import com.oracle.graal.python.builtins.objects.PNotImplemented;
67+
import com.oracle.graal.python.builtins.objects.bytes.BytesNodes;
68+
import com.oracle.graal.python.builtins.objects.bytes.PIBytesLike;
6769
import com.oracle.graal.python.builtins.objects.common.HashingStorageNodes.SetItemNode;
6870
import com.oracle.graal.python.builtins.objects.dict.PDict;
6971
import com.oracle.graal.python.builtins.objects.ints.PInt;
7072
import com.oracle.graal.python.builtins.objects.iterator.PStringIterator;
7173
import com.oracle.graal.python.builtins.objects.list.ListBuiltins.ListAppendNode;
7274
import com.oracle.graal.python.builtins.objects.list.ListBuiltins.ListReverseNode;
7375
import com.oracle.graal.python.builtins.objects.list.PList;
76+
import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
7477
import com.oracle.graal.python.builtins.objects.slice.PSlice;
7578
import com.oracle.graal.python.builtins.objects.slice.PSlice.SliceInfo;
7679
import com.oracle.graal.python.builtins.objects.str.StringBuiltinsFactory.SpliceNodeGen;
@@ -751,6 +754,29 @@ public String translate(String self, PDict table,
751754

752755
return new String(translatedChars);
753756
}
757+
758+
private static String translateFromByteTable(String text, Object table, BytesNodes.ToBytesNode toBytesNode) {
759+
byte[] translatedChars = text.getBytes();
760+
byte[] byteTable = toBytesNode.execute(table);
761+
for (int i = 0; i < translatedChars.length; i++) {
762+
byte original = translatedChars[i];
763+
translatedChars[i] = byteTable[original];
764+
}
765+
return new String(translatedChars);
766+
}
767+
768+
@Specialization
769+
public String translate(String self, PIBytesLike table,
770+
@Cached("create()") BytesNodes.ToBytesNode getBytesNode) {
771+
return translateFromByteTable(self, table, getBytesNode);
772+
}
773+
774+
@Specialization
775+
public String translate(String self, PMemoryView table,
776+
@Cached("create()") BytesNodes.ToBytesNode getBytesNode) {
777+
return translateFromByteTable(self, table, getBytesNode);
778+
}
779+
754780
}
755781

756782
protected abstract static class SpliceNode extends PNodeWithContext {

0 commit comments

Comments
 (0)