Skip to content

Commit f4f99ea

Browse files
committed
[GR-13496] bytes.maketrans has to return bytes, not dict.
1 parent 873bf44 commit f4f99ea

File tree

3 files changed

+47
-29
lines changed

3 files changed

+47
-29
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,3 +629,19 @@ def test_add_mv_to_bytearray():
629629
mv = memoryview(b'world')
630630
ba += mv
631631
assert ba == b'hello world'
632+
633+
class BaseLikeBytes:
634+
635+
def test_maketrans(self):
636+
transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`xyzdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377'
637+
self.assertEqual(self.type2test.maketrans(b'abc', b'xyz'), transtable)
638+
transtable = b'\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037 !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374xyz'
639+
self.assertEqual(self.type2test.maketrans(b'\375\376\377', b'xyz'), transtable)
640+
self.assertRaises(ValueError, self.type2test.maketrans, b'abc', b'xyzq')
641+
self.assertRaises(TypeError, self.type2test.maketrans, 'abc', 'def')
642+
643+
class BytesTest(BaseLikeBytes, unittest.TestCase):
644+
type2test = bytes
645+
646+
class ByteArrayTest(BaseLikeBytes, unittest.TestCase):
647+
type2test = bytearray

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/AbstractBytesBuiltins.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import com.oracle.graal.python.builtins.objects.ints.PInt;
5050
import com.oracle.graal.python.builtins.objects.list.ListBuiltins.ListAppendNode;
5151
import com.oracle.graal.python.builtins.objects.list.PList;
52+
import com.oracle.graal.python.builtins.objects.type.PythonClass;
5253
import com.oracle.graal.python.nodes.argument.ReadArgumentNode;
5354
import com.oracle.graal.python.nodes.function.PythonBuiltinBaseNode;
5455
import com.oracle.graal.python.nodes.function.PythonBuiltinNode;
@@ -775,4 +776,34 @@ protected AbstractSplitNode createRecursiveNode() {
775776
return AbstractBytesBuiltinsFactory.RSplitNodeFactory.create(new ReadArgumentNode[]{});
776777
}
777778
}
779+
780+
// static bytes.maketrans()
781+
// static bytearray.maketrans()
782+
@Builtin(name = "maketrans", fixedNumOfPositionalArgs = 3, isClassmethod = true)
783+
@GenerateNodeFactory
784+
public abstract static class MakeTransNode extends PythonBuiltinNode {
785+
786+
@Specialization
787+
public PBytes maketrans(PythonClass cls, Object from, Object to,
788+
@Cached("create()") BytesNodes.ToBytesNode toByteNode) {
789+
byte[] fromB = toByteNode.execute(from);
790+
byte[] toB = toByteNode.execute(to);
791+
if (fromB.length != toB.length) {
792+
throw raise(PythonErrorType.ValueError, "maketrans arguments must have same length");
793+
}
794+
795+
byte[] table = new byte[256];
796+
for (int i = 0; i < 256; i++) {
797+
table[i] = (byte) i;
798+
}
799+
800+
for (int i = 0; i < fromB.length; i++) {
801+
byte value = fromB[i];
802+
table[value < 0 ? value + 256 : value] = toB[i];
803+
}
804+
805+
return factory().createBytes(table);
806+
}
807+
808+
}
778809
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/bytes/BytesBuiltins.java

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,8 @@
5454
import com.oracle.graal.python.builtins.PythonBuiltins;
5555
import com.oracle.graal.python.builtins.objects.PNone;
5656
import com.oracle.graal.python.builtins.objects.PNotImplemented;
57-
import com.oracle.graal.python.builtins.objects.common.HashingCollectionNodes.SetItemNode;
5857
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes;
5958
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.NormalizeIndexNode;
60-
import com.oracle.graal.python.builtins.objects.common.SequenceStorageNodes.ToByteArrayNode;
61-
import com.oracle.graal.python.builtins.objects.dict.PDict;
6259
import com.oracle.graal.python.builtins.objects.iterator.PSequenceIterator;
6360
import com.oracle.graal.python.builtins.objects.list.PList;
6461
import com.oracle.graal.python.builtins.objects.memoryview.PMemoryView;
@@ -546,32 +543,6 @@ Object getitem(PBytes self, Object idx, Object value) {
546543
}
547544
}
548545

549-
// static str.maketrans()
550-
@Builtin(name = "maketrans", fixedNumOfPositionalArgs = 2)
551-
@GenerateNodeFactory
552-
public abstract static class MakeTransNode extends PythonBuiltinNode {
553-
554-
@Specialization
555-
public PDict maketrans(PBytes from, PBytes to,
556-
@Cached("create()") SetItemNode setItemNode,
557-
@Cached("create()") ToByteArrayNode toByteArrayNode) {
558-
byte[] fromB = toByteArrayNode.execute(from.getSequenceStorage());
559-
byte[] toB = toByteArrayNode.execute(to.getSequenceStorage());
560-
if (fromB.length != toB.length) {
561-
throw new RuntimeException("maketrans arguments must have same length");
562-
}
563-
564-
PDict translation = factory().createDict();
565-
for (int i = 0; i < fromB.length; i++) {
566-
int key = fromB[i];
567-
int value = toB[i];
568-
setItemNode.execute(translation, key, value);
569-
}
570-
571-
return translation;
572-
}
573-
}
574-
575546
@Builtin(name = "replace", fixedNumOfPositionalArgs = 3)
576547
@GenerateNodeFactory
577548
abstract static class ReplaceNode extends PythonTernaryBuiltinNode {

0 commit comments

Comments
 (0)