Commits

Philip Jenvey  committed 39e9d56

add bytearray.maketrans and force it to always return exact bytes

  • Participants
  • Parent commits f25830a
  • Branches py3k

Comments (0)

Files changed (4)

File pypy/objspace/std/bytearraytype.py

     str_expandtabs, str_ljust, str_rjust, str_center, str_zfill,
     str_join, str_split, str_rsplit, str_partition, str_rpartition,
     str_splitlines, str_translate)
-from pypy.objspace.std.stringtype import makebytesdata_w
+from pypy.objspace.std.stringtype import descr_maketrans, makebytesdata_w
 from pypy.objspace.std.listtype import (
     list_append, list_extend)
 
     __init__ = interp2app(descr__init__),
     __hash__ = None,
     __reduce__ = interp2app(descr_bytearray__reduce__),
-    fromhex = interp2app(descr_fromhex, as_classmethod=True)
+    fromhex = interp2app(descr_fromhex, as_classmethod=True),
+    maketrans = interp2app(descr_maketrans, as_classmethod=True)
     )
 bytearray_typedef.registermethods(globals())

File pypy/objspace/std/stringtype.py

         char_to = list_to[i]
         base_table[pos_from] = char_to
     
-    chars = ''.join(base_table)
-    if space.config.objspace.std.withrope:
-        from pypy.objspace.std.ropeobject import rope, W_RopeObject
-        w_obj = space.allocate_instance(W_RopeObject, w_type)
-        W_RopeObject.__init__(w_obj, rope.LiteralStringNode(chars))
-        return w_obj
-    else:
-        from pypy.objspace.std.stringobject import W_StringObject
-        w_obj = space.allocate_instance(W_StringObject, w_type)
-        W_StringObject.__init__(w_obj, chars)
-        return w_obj
+    return wrapstr(space, ''.join(base_table))
 
 # ____________________________________________________________
 

File pypy/objspace/std/test/test_bytearrayobject.py

         for i in range(count):
             b[i:i+1] = b'y'
         assert bytes(b) == b'y' * count
+
+    def test_maketrans(self):
+        table = 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'
+        result = bytearray.maketrans(b'abc', b'xyz')
+        assert result == table
+        assert type(result) is bytes

File pypy/objspace/std/test/test_stringobject.py

         iterable = b"hello"
         raises(TypeError, len, iter(iterable))
 
+    def test_maketrans(self):
+        table = 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'
+        assert bytes.maketrans(b'abc', b'xyz') == table
+
     def test_compatibility(self):
         #a whole bunch of methods should accept bytearray/memoryview without complaining...
         #I don't know how slavishly we should follow the cpython spec here, since it appears
             assert not b.startswith((bb, bb))
             assert not b.endswith(bb)
             assert not b.endswith((bb, bb))
-            assert b.maketrans(bb, bb)
+            assert bytes.maketrans(bb, bb)
+            assert bytearray.maketrans(bb, bb)
 
 class AppTestPrebuilt(AppTestStringObject):
     spaceconfig = {"objspace.std.withprebuiltchar": True}