Author: Manuel Jacob
Branch: refactor-str-types
Changeset: r65594:6689c40a01fe
Date: 2013-07-24 11:12 +0200
http://bitbucket.org/pypy/pypy/changeset/6689c40a01fe/

Log:    Make bytearray tests pass.

diff --git a/pypy/objspace/std/bytearrayobject.py 
b/pypy/objspace/std/bytearrayobject.py
--- a/pypy/objspace/std/bytearrayobject.py
+++ b/pypy/objspace/std/bytearrayobject.py
@@ -3,7 +3,7 @@
 from pypy.interpreter.baseobjspace import ObjSpace, W_Root
 from pypy.interpreter.buffer import RWBuffer
 from pypy.interpreter.error import OperationError, operationerrfmt
-from pypy.interpreter.gateway import interp2app
+from pypy.interpreter.gateway import interp2app, unwrap_spec, WrappedDefault
 from pypy.interpreter.signature import Signature
 from pypy.objspace.std import bytesobject
 from pypy.objspace.std.intobject import W_IntObject
@@ -11,7 +11,6 @@
 from pypy.objspace.std.model import W_Object, registerimplementation
 from pypy.objspace.std.multimethod import FailedToImplement
 from pypy.objspace.std.noneobject import W_NoneObject
-from pypy.objspace.std.register_all import register_all
 from pypy.objspace.std.sliceobject import W_SliceObject, normalize_simple_slice
 from pypy.objspace.std.stdtypedef import StdTypeDef, SMM
 from pypy.objspace.std.stringmethods import StringMethods
@@ -36,10 +35,235 @@
         return len(self.data)
 
     def _val(self, space):
-        return self.data
+        return space.bufferstr_w(self)
 
-    def _op_val(self, w_other):
-        return w_other.data
+    def _op_val(self, space, w_other):
+        return space.bufferstr_new_w(w_other)
+
+    def _chr(self, char):
+        return str(char)
+
+    _builder = StringBuilder
+
+    def _newlist_unwrapped(self, space, res):
+        return space.wrap([W_BytearrayObject(list(i)) for i in res])
+
+    def _isupper(self, ch):
+        return ch.isupper()
+
+    def _islower(self, ch):
+        return ch.islower()
+
+    def _istitle(self, ch):
+        return ch.istitle()
+
+    def _isspace(self, ch):
+        return ch.isspace()
+
+    def _isalpha(self, ch):
+        return ch.isalpha()
+
+    def _isalnum(self, ch):
+        return ch.isalnum()
+
+    def _isdigit(self, ch):
+        return ch.isdigit()
+
+    _iscased = _isalpha
+
+    def _upper(self, ch):
+        if ch.islower():
+            o = ord(ch) - 32
+            return chr(o)
+        else:
+            return ch
+
+    def _lower(self, ch):
+        if ch.isupper():
+            o = ord(ch) + 32
+            return chr(o)
+        else:
+            return ch
+
+    def _join_return_one(self, space, w_obj):
+        return space.is_w(space.type(w_obj), space.w_unicode)
+
+    def _join_check_item(self, space, w_obj):
+        if (space.is_w(space.type(w_obj), space.w_str) or
+            space.is_w(space.type(w_obj), space.w_bytearray)):
+            return 0
+        return 1
+
+    def ord(self, space):
+        if len(self.data) != 1:
+            msg = "ord() expected a character, but string of length %d found"
+            raise operationerrfmt(space.w_TypeError, msg, len(self.data))
+        return space.wrap(ord(self.data[0]))
+
+    def descr_init(self, space, __args__):
+        # this is on the silly side
+        w_source, w_encoding, w_errors = __args__.parse_obj(
+                None, 'bytearray', init_signature, init_defaults)
+
+        if w_source is None:
+            w_source = space.wrap('')
+        if w_encoding is None:
+            w_encoding = space.w_None
+        if w_errors is None:
+            w_errors = space.w_None
+
+        # Unicode argument
+        if not space.is_w(w_encoding, space.w_None):
+            from pypy.objspace.std.unicodeobject import (
+                _get_encoding_and_errors, encode_object
+            )
+            encoding, errors = _get_encoding_and_errors(space, w_encoding, 
w_errors)
+
+            # if w_source is an integer this correctly raises a TypeError
+            # the CPython error message is: "encoding or errors without a 
string argument"
+            # ours is: "expected unicode, got int object"
+            w_source = encode_object(space, w_source, encoding, errors)
+
+        # Is it an int?
+        try:
+            count = space.int_w(w_source)
+        except OperationError, e:
+            if not e.match(space, space.w_TypeError):
+                raise
+        else:
+            if count < 0:
+                raise OperationError(space.w_ValueError,
+                                     space.wrap("bytearray negative count"))
+            self.data = ['\0'] * count
+            return
+
+        data = makebytearraydata_w(space, w_source)
+        self.data = data
+
+    def descr_repr(self, space):
+        s = self.data
+
+        # Good default if there are no replacements.
+        buf = StringBuilder(len("bytearray(b'')") + len(s))
+
+        buf.append("bytearray(b'")
+
+        for i in range(len(s)):
+            c = s[i]
+
+            if c == '\\' or c == "'":
+                buf.append('\\')
+                buf.append(c)
+            elif c == '\t':
+                buf.append('\\t')
+            elif c == '\r':
+                buf.append('\\r')
+            elif c == '\n':
+                buf.append('\\n')
+            elif not '\x20' <= c < '\x7f':
+                n = ord(c)
+                buf.append('\\x')
+                buf.append("0123456789abcdef"[n>>4])
+                buf.append("0123456789abcdef"[n&0xF])
+            else:
+                buf.append(c)
+
+        buf.append("')")
+
+        return space.wrap(buf.build())
+
+    def descr_str(self, space):
+        return space.wrap(''.join(self.data))
+
+    def descr_buffer(self, space):
+        return BytearrayBuffer(self.data)
+
+    def descr_inplace_add(self, space, w_other):
+        if isinstance(w_other, W_BytearrayObject):
+            self.data += w_other.data
+        else:
+            self.data += self._op_val(space, w_other)
+        return self
+
+    def descr_inplace_mul(self, space, w_times):
+        try:
+            times = space.getindex_w(w_times, space.w_OverflowError)
+        except OperationError, e:
+            if e.match(space, space.w_TypeError):
+                return space.w_NotImplemented
+            raise
+        self.data *= times
+        return self
+
+    def descr_setitem(self, space, w_index, w_other):
+        if isinstance(w_index, W_SliceObject):
+            oldsize = len(self.data)
+            start, stop, step, slicelength = w_index.indices4(space, oldsize)
+            sequence2 = makebytearraydata_w(space, w_other)
+            _setitem_slice_helper(space, self.data, start, step,
+                                  slicelength, sequence2, empty_elem='\x00')
+        else:
+            idx = space.getindex_w(w_index, space.w_IndexError, "bytearray 
index")
+            try:
+                self.data[idx] = getbytevalue(space, w_other)
+            except IndexError:
+                raise OperationError(space.w_IndexError,
+                                     space.wrap("bytearray index out of 
range"))
+
+    def descr_delitem(self, space, w_idx):
+        if isinstance(w_idx, W_SliceObject):
+            start, stop, step, slicelength = w_idx.indices4(space,
+                                                            len(self.data))
+            _delitem_slice_helper(space, self.data, start, step, slicelength)
+        else:
+            idx = space.getindex_w(w_idx, space.w_IndexError, "bytearray 
index")
+            try:
+                del self.data[idx]
+            except IndexError:
+                raise OperationError(space.w_IndexError,
+                                     space.wrap("bytearray deletion index out 
of range"))
+
+    def descr_append(self, space, w_item):
+        self.data.append(getbytevalue(space, w_item))
+
+    def descr_extend(self, space, w_other):
+        if isinstance(w_other, W_BytearrayObject):
+            self.data += w_other.data
+        else:
+            self.data += makebytearraydata_w(space, w_other)
+        return self
+
+    def descr_insert(self, space, w_idx, w_other):
+        where = space.int_w(w_idx)
+        length = len(self.data)
+        index = get_positive_index(where, length)
+        val = getbytevalue(space, w_other)
+        self.data.insert(index, val)
+        return space.w_None
+
+    @unwrap_spec(w_idx=WrappedDefault(-1))
+    def descr_pop(self, space, w_idx):
+        index = space.int_w(w_idx)
+        try:
+            result = self.data.pop(index)
+        except IndexError:
+            if not self.data:
+                raise OperationError(space.w_IndexError, space.wrap(
+                    "pop from empty bytearray"))
+            raise OperationError(space.w_IndexError, space.wrap(
+                "pop index out of range"))
+        return space.wrap(ord(result))
+
+    def descr_remove(self, space, w_char):
+        char = space.int_w(space.index(w_char))
+        try:
+            result = self.data.remove(chr(char))
+        except ValueError:
+            raise OperationError(space.w_ValueError, space.wrap(
+                "value not found in bytearray"))
+
+    def descr_reverse(self, space):
+        self.data.reverse()
 
 W_BytearrayObject.EMPTY = W_BytearrayObject([])
 
@@ -200,110 +424,82 @@
     __reduce__ = interp2app(descr_bytearray__reduce__),
     fromhex = interp2app(descr_fromhex, as_classmethod=True),
 
-#    __repr__ = interp2app(W_BytearrayObject.descr_repr),
-#    __str__ = interp2app(W_BytearrayObject.descr_str),
+    __repr__ = interp2app(W_BytearrayObject.descr_repr),
+    __str__ = interp2app(W_BytearrayObject.descr_str),
 
-#    __eq__ = interp2app(W_BytearrayObject.descr_eq),
-#    __ne__ = interp2app(W_BytearrayObject.descr_ne),
-#    __lt__ = interp2app(W_BytearrayObject.descr_lt),
-#    __le__ = interp2app(W_BytearrayObject.descr_le),
-#    __gt__ = interp2app(W_BytearrayObject.descr_gt),
-#    __ge__ = interp2app(W_BytearrayObject.descr_ge),
+    __eq__ = interp2app(W_BytearrayObject.descr_eq),
+    __ne__ = interp2app(W_BytearrayObject.descr_ne),
+    __lt__ = interp2app(W_BytearrayObject.descr_lt),
+    __le__ = interp2app(W_BytearrayObject.descr_le),
+    __gt__ = interp2app(W_BytearrayObject.descr_gt),
+    __ge__ = interp2app(W_BytearrayObject.descr_ge),
 
-#    __len__ = interp2app(W_BytearrayObject.descr_len),
-#    __iter__ = interp2app(W_BytearrayObject.descr_iter),
-#    __contains__ = interp2app(W_BytearrayObject.descr_contains),
+    __len__ = interp2app(W_BytearrayObject.descr_len),
+    __contains__ = interp2app(W_BytearrayObject.descr_contains),
 
-#    __add__ = interp2app(W_BytearrayObject.descr_add),
+    __add__ = interp2app(W_BytearrayObject.descr_add),
     __mul__ = interp2app(W_BytearrayObject.descr_mul),
     __rmul__ = interp2app(W_BytearrayObject.descr_mul),
 
-#    __getitem__ = interp2app(W_BytearrayObject.descr_getitem),
+    __getitem__ = interp2app(W_BytearrayObject.descr_getitem),
 
-#    capitalize = interp2app(W_BytearrayObject.descr_capitalize),
-#    center = interp2app(W_BytearrayObject.descr_center),
-#    count = interp2app(W_BytearrayObject.descr_count),
-#    decode = interp2app(W_BytearrayObject.descr_decode),
-#    expandtabs = interp2app(W_BytearrayObject.descr_expandtabs),
-#    find = interp2app(W_BytearrayObject.descr_find),
-#    rfind = interp2app(W_BytearrayObject.descr_rfind),
-#    index = interp2app(W_BytearrayObject.descr_index),
-#    rindex = interp2app(W_BytearrayObject.descr_rindex),
-#    isalnum = interp2app(W_BytearrayObject.descr_isalnum),
-#    isalpha = interp2app(W_BytearrayObject.descr_isalpha),
-#    isdigit = interp2app(W_BytearrayObject.descr_isdigit),
-#    islower = interp2app(W_BytearrayObject.descr_islower),
-#    isspace = interp2app(W_BytearrayObject.descr_isspace),
-#    istitle = interp2app(W_BytearrayObject.descr_istitle),
-#    isupper = interp2app(W_BytearrayObject.descr_isupper),
-#    join = interp2app(W_BytearrayObject.descr_join),
-#    ljust = interp2app(W_BytearrayObject.descr_ljust),
-#    rjust = interp2app(W_BytearrayObject.descr_rjust),
-#    lower = interp2app(W_BytearrayObject.descr_lower),
-#    partition = interp2app(W_BytearrayObject.descr_partition),
-#    rpartition = interp2app(W_BytearrayObject.descr_rpartition),
-#    replace = interp2app(W_BytearrayObject.descr_replace),
-#    split = interp2app(W_BytearrayObject.descr_split),
-#    rsplit = interp2app(W_BytearrayObject.descr_rsplit),
-#    splitlines = interp2app(W_BytearrayObject.descr_splitlines),
-#    startswith = interp2app(W_BytearrayObject.descr_startswith),
-#    endswith = interp2app(W_BytearrayObject.descr_endswith),
-#    strip = interp2app(W_BytearrayObject.descr_strip),
-#    lstrip = interp2app(W_BytearrayObject.descr_lstrip),
-#    rstrip = interp2app(W_BytearrayObject.descr_rstrip),
-#    swapcase = interp2app(W_BytearrayObject.descr_swapcase),
-#    title = interp2app(W_BytearrayObject.descr_title),
-#    translate = interp2app(W_BytearrayObject.descr_translate),
-#    upper = interp2app(W_BytearrayObject.descr_upper),
-#    zfill = interp2app(W_BytearrayObject.descr_zfill),
+    capitalize = interp2app(W_BytearrayObject.descr_capitalize),
+    center = interp2app(W_BytearrayObject.descr_center),
+    count = interp2app(W_BytearrayObject.descr_count),
+    decode = interp2app(W_BytearrayObject.descr_decode),
+    expandtabs = interp2app(W_BytearrayObject.descr_expandtabs),
+    find = interp2app(W_BytearrayObject.descr_find),
+    rfind = interp2app(W_BytearrayObject.descr_rfind),
+    index = interp2app(W_BytearrayObject.descr_index),
+    rindex = interp2app(W_BytearrayObject.descr_rindex),
+    isalnum = interp2app(W_BytearrayObject.descr_isalnum),
+    isalpha = interp2app(W_BytearrayObject.descr_isalpha),
+    isdigit = interp2app(W_BytearrayObject.descr_isdigit),
+    islower = interp2app(W_BytearrayObject.descr_islower),
+    isspace = interp2app(W_BytearrayObject.descr_isspace),
+    istitle = interp2app(W_BytearrayObject.descr_istitle),
+    isupper = interp2app(W_BytearrayObject.descr_isupper),
+    join = interp2app(W_BytearrayObject.descr_join),
+    ljust = interp2app(W_BytearrayObject.descr_ljust),
+    rjust = interp2app(W_BytearrayObject.descr_rjust),
+    lower = interp2app(W_BytearrayObject.descr_lower),
+    partition = interp2app(W_BytearrayObject.descr_partition),
+    rpartition = interp2app(W_BytearrayObject.descr_rpartition),
+    replace = interp2app(W_BytearrayObject.descr_replace),
+    split = interp2app(W_BytearrayObject.descr_split),
+    rsplit = interp2app(W_BytearrayObject.descr_rsplit),
+    splitlines = interp2app(W_BytearrayObject.descr_splitlines),
+    startswith = interp2app(W_BytearrayObject.descr_startswith),
+    endswith = interp2app(W_BytearrayObject.descr_endswith),
+    strip = interp2app(W_BytearrayObject.descr_strip),
+    lstrip = interp2app(W_BytearrayObject.descr_lstrip),
+    rstrip = interp2app(W_BytearrayObject.descr_rstrip),
+    swapcase = interp2app(W_BytearrayObject.descr_swapcase),
+    title = interp2app(W_BytearrayObject.descr_title),
+    translate = interp2app(W_BytearrayObject.descr_translate),
+    upper = interp2app(W_BytearrayObject.descr_upper),
+    zfill = interp2app(W_BytearrayObject.descr_zfill),
+
+    __init__ = interp2app(W_BytearrayObject.descr_init),
+    __buffer__ = interp2app(W_BytearrayObject.descr_buffer),
+
+    __iadd__ = interp2app(W_BytearrayObject.descr_inplace_add),
+    __imul__ = interp2app(W_BytearrayObject.descr_inplace_mul),
+    __setitem__ = interp2app(W_BytearrayObject.descr_setitem),
+    __delitem__ = interp2app(W_BytearrayObject.descr_delitem),
+
+    append = interp2app(W_BytearrayObject.descr_append),
+    extend = interp2app(W_BytearrayObject.descr_extend),
+    insert = interp2app(W_BytearrayObject.descr_insert),
+    pop = interp2app(W_BytearrayObject.descr_pop),
+    remove = interp2app(W_BytearrayObject.descr_remove),
+    reverse = interp2app(W_BytearrayObject.descr_reverse),
 )
-bytearray_typedef.registermethods(globals())
-
 registerimplementation(W_BytearrayObject)
 
 init_signature = Signature(['source', 'encoding', 'errors'], None, None)
 init_defaults = [None, None, None]
 
-def init__Bytearray(space, w_bytearray, __args__):
-    # this is on the silly side
-    w_source, w_encoding, w_errors = __args__.parse_obj(
-            None, 'bytearray', init_signature, init_defaults)
-
-    if w_source is None:
-        w_source = space.wrap('')
-    if w_encoding is None:
-        w_encoding = space.w_None
-    if w_errors is None:
-        w_errors = space.w_None
-
-    # Unicode argument
-    if not space.is_w(w_encoding, space.w_None):
-        from pypy.objspace.std.unicodeobject import (
-            _get_encoding_and_errors, encode_object
-        )
-        encoding, errors = _get_encoding_and_errors(space, w_encoding, 
w_errors)
-
-        # if w_source is an integer this correctly raises a TypeError
-        # the CPython error message is: "encoding or errors without a string 
argument"
-        # ours is: "expected unicode, got int object"
-        w_source = encode_object(space, w_source, encoding, errors)
-
-    # Is it an int?
-    try:
-        count = space.int_w(w_source)
-    except OperationError, e:
-        if not e.match(space, space.w_TypeError):
-            raise
-    else:
-        if count < 0:
-            raise OperationError(space.w_ValueError,
-                                 space.wrap("bytearray negative count"))
-        w_bytearray.data = ['\0'] * count
-        return
-
-    data = makebytearraydata_w(space, w_source)
-    w_bytearray.data = data
-
 def len__Bytearray(space, w_bytearray):
     result = len(w_bytearray.data)
     return wrapint(space, result)
@@ -379,16 +575,6 @@
     data1 = [c for c in space.str_w(w_str)]
     return W_BytearrayObject(data1 + data2)
 
-def inplace_mul__Bytearray_ANY(space, w_bytearray, w_times):
-    try:
-        times = space.getindex_w(w_times, space.w_OverflowError)
-    except OperationError, e:
-        if e.match(space, space.w_TypeError):
-            raise FailedToImplement
-        raise
-    w_bytearray.data *= times
-    return w_bytearray
-
 def eq__Bytearray_Bytearray(space, w_bytearray1, w_bytearray2):
     data1 = w_bytearray1.data
     data2 = w_bytearray2.data
@@ -444,43 +630,6 @@
     # No more items to compare -- compare sizes
     return space.newbool(len(data1) > len(data2))
 
-# Mostly copied from repr__String, but without the "smart quote"
-# functionality.
-def repr__Bytearray(space, w_bytearray):
-    s = w_bytearray.data
-
-    # Good default if there are no replacements.
-    buf = StringBuilder(len("bytearray(b'')") + len(s))
-
-    buf.append("bytearray(b'")
-
-    for i in range(len(s)):
-        c = s[i]
-
-        if c == '\\' or c == "'":
-            buf.append('\\')
-            buf.append(c)
-        elif c == '\t':
-            buf.append('\\t')
-        elif c == '\r':
-            buf.append('\\r')
-        elif c == '\n':
-            buf.append('\\n')
-        elif not '\x20' <= c < '\x7f':
-            n = ord(c)
-            buf.append('\\x')
-            buf.append("0123456789abcdef"[n>>4])
-            buf.append("0123456789abcdef"[n&0xF])
-        else:
-            buf.append(c)
-
-    buf.append("')")
-
-    return space.wrap(buf.build())
-
-def str__Bytearray(space, w_bytearray):
-    return space.wrap(''.join(w_bytearray.data))
-
 def str_count__Bytearray_ANY_ANY_ANY(space, w_bytearray, w_char, w_start, 
w_stop):
     w_char = space.wrap(space.bufferstr_new_w(w_char))
     w_str = str__Bytearray(space, w_bytearray)
@@ -586,38 +735,6 @@
     w_str = str__Bytearray(space, w_bytearray)
     return bytesobject.str_isspace__String(space, w_str)
 
-def bytearray_insert__Bytearray_Int_ANY(space, w_bytearray, w_idx, w_other):
-    where = space.int_w(w_idx)
-    length = len(w_bytearray.data)
-    index = get_positive_index(where, length)
-    val = getbytevalue(space, w_other)
-    w_bytearray.data.insert(index, val)
-    return space.w_None
-
-def bytearray_pop__Bytearray_Int(space, w_bytearray, w_idx):
-    index = space.int_w(w_idx)
-    try:
-        result = w_bytearray.data.pop(index)
-    except IndexError:
-        if not w_bytearray.data:
-            raise OperationError(space.w_IndexError, space.wrap(
-                "pop from empty bytearray"))
-        raise OperationError(space.w_IndexError, space.wrap(
-            "pop index out of range"))
-    return space.wrap(ord(result))
-
-def bytearray_remove__Bytearray_ANY(space, w_bytearray, w_char):
-    char = space.int_w(space.index(w_char))
-    try:
-        result = w_bytearray.data.remove(chr(char))
-    except ValueError:
-        raise OperationError(space.w_ValueError, space.wrap(
-            "value not found in bytearray"))
-
-def bytearray_reverse__Bytearray(space, w_bytearray):
-    w_bytearray.data.reverse()
-    return space.w_None
-
 _space_chars = ''.join([chr(c) for c in [9, 10, 11, 12, 13, 32]])
 
 def bytearray_strip__Bytearray_None(space, w_bytearray, w_chars):
@@ -638,54 +755,6 @@
 def bytearray_rstrip__Bytearray_ANY(space, w_bytearray, w_chars):
     return _strip(space, w_bytearray, space.bufferstr_new_w(w_chars), 0, 1)
 
-# __________________________________________________________
-# Mutability methods
-
-def bytearray_append__Bytearray_ANY(space, w_bytearray, w_item):
-    w_bytearray.data.append(getbytevalue(space, w_item))
-
-def bytearray_extend__Bytearray_Bytearray(space, w_bytearray, w_other):
-    w_bytearray.data += w_other.data
-
-def bytearray_extend__Bytearray_ANY(space, w_bytearray, w_other):
-    w_bytearray.data += makebytearraydata_w(space, w_other)
-
-def inplace_add__Bytearray_Bytearray(space, w_bytearray1, w_bytearray2):
-    bytearray_extend__Bytearray_Bytearray(space, w_bytearray1, w_bytearray2)
-    return w_bytearray1
-
-def inplace_add__Bytearray_ANY(space, w_bytearray1, w_iterable2):
-    w_bytearray1.data += space.bufferstr_new_w(w_iterable2)
-    return w_bytearray1
-
-def setitem__Bytearray_ANY_ANY(space, w_bytearray, w_index, w_item):
-    idx = space.getindex_w(w_index, space.w_IndexError, "bytearray index")
-    try:
-        w_bytearray.data[idx] = getbytevalue(space, w_item)
-    except IndexError:
-        raise OperationError(space.w_IndexError,
-                             space.wrap("bytearray index out of range"))
-
-def setitem__Bytearray_Slice_ANY(space, w_bytearray, w_slice, w_other):
-    oldsize = len(w_bytearray.data)
-    start, stop, step, slicelength = w_slice.indices4(space, oldsize)
-    sequence2 = makebytearraydata_w(space, w_other)
-    _setitem_slice_helper(space, w_bytearray.data, start, step, slicelength, 
sequence2, empty_elem='\x00')
-
-def delitem__Bytearray_ANY(space, w_bytearray, w_idx):
-    idx = space.getindex_w(w_idx, space.w_IndexError, "bytearray index")
-    try:
-        del w_bytearray.data[idx]
-    except IndexError:
-        raise OperationError(space.w_IndexError,
-                             space.wrap("bytearray deletion index out of 
range"))
-    return space.w_None
-
-def delitem__Bytearray_Slice(space, w_bytearray, w_slice):
-    start, stop, step, slicelength = w_slice.indices4(space,
-                                                      len(w_bytearray.data))
-    _delitem_slice_helper(space, w_bytearray.data, start, step, slicelength)
-
 #XXX share the code again with the stuff in listobject.py
 def _delitem_slice_helper(space, items, start, step, slicelength):
     if slicelength==0:
@@ -802,5 +871,3 @@
 def buffer__Bytearray(space, self):
     b = BytearrayBuffer(self.data)
     return space.wrap(b)
-
-#register_all(vars(), globals())
diff --git a/pypy/objspace/std/bytesobject.py b/pypy/objspace/std/bytesobject.py
--- a/pypy/objspace/std/bytesobject.py
+++ b/pypy/objspace/std/bytesobject.py
@@ -177,8 +177,12 @@
     def descr_add(self, space, w_other):
         if space.isinstance_w(w_other, space.w_unicode):
             self_as_unicode = decode_object(space, self, None, None)
-            #return self_as_unicode.descr_add(space, w_other)
             return space.add(self_as_unicode, w_other)
+        elif space.isinstance_w(w_other, space.w_bytearray):
+            # XXX: eliminate double-copy
+            from .bytearrayobject import W_BytearrayObject
+            self_as_bytearray = W_BytearrayObject(list(self._value))
+            return space.add(self_as_bytearray, w_other)
         return StringMethods.descr_add(self, space, w_other)
 
     def _startswith(self, space, value, w_prefix, start, end):
@@ -266,7 +270,6 @@
     __ge__ = interp2app(W_BytesObject.descr_ge),
 
     __len__ = interp2app(W_BytesObject.descr_len),
-    #__iter__ = interp2app(W_BytesObject.descr_iter),
     __contains__ = interp2app(W_BytesObject.descr_contains),
 
     __add__ = interp2app(W_BytesObject.descr_add),
diff --git a/pypy/objspace/std/stringmethods.py 
b/pypy/objspace/std/stringmethods.py
--- a/pypy/objspace/std/stringmethods.py
+++ b/pypy/objspace/std/stringmethods.py
@@ -104,6 +104,17 @@
     #    pass
 
     def descr_contains(self, space, w_sub):
+        from pypy.objspace.std.bytearrayobject import W_BytearrayObject
+        if (isinstance(self, W_BytearrayObject) and
+            space.isinstance_w(w_sub, space.w_int)):
+            char = space.int_w(w_sub)
+            if not 0 <= char < 256:
+                raise OperationError(space.w_ValueError,
+                                     space.wrap("byte must be in range(0, 
256)"))
+            for c in self.data:
+                if ord(c) == char:
+                    return space.w_True
+            return space.w_False
         return space.newbool(self._val(space).find(self._op_val(space, w_sub)) 
>= 0)
 
     def descr_add(self, space, w_other):
@@ -144,6 +155,9 @@
         if index < 0 or index >= selflen:
             raise OperationError(space.w_IndexError,
                                  space.wrap("string index out of range"))
+        from pypy.objspace.std.bytearrayobject import W_BytearrayObject
+        if isinstance(self, W_BytearrayObject):
+            return space.wrap(ord(selfvalue[index]))
         #return wrapchar(space, selfvalue[index])
         return self._new(selfvalue[index])
 
@@ -165,7 +179,7 @@
         builder.append(self._upper(value[0]))
         for i in range(1, len(value)):
             builder.append(self._lower(value[i]))
-        return space.wrap(builder.build())
+        return self._new(builder.build())
 
     @unwrap_spec(width=int, w_fillchar=WrappedDefault(' '))
     def descr_center(self, space, width, w_fillchar):
@@ -419,7 +433,7 @@
             fillchar = fillchar[0]    # annotator hint: it's a single character
             value += d * fillchar
 
-        return space.wrap(value)
+        return self._new(value)
 
     @unwrap_spec(width=int, w_fillchar=WrappedDefault(' '))
     def descr_rjust(self, space, width, w_fillchar):
@@ -434,7 +448,7 @@
             fillchar = fillchar[0]    # annotator hint: it's a single character
             value = d * fillchar + value
 
-        return space.wrap(value)
+        return self._new(value)
 
     def descr_lower(self, space):
         value = self._val(space)
@@ -453,6 +467,9 @@
         if pos == -1:
             return space.newtuple([self, self.EMPTY, self.EMPTY])
         else:
+            from pypy.objspace.std.bytearrayobject import W_BytearrayObject
+            if isinstance(self, W_BytearrayObject):
+                w_sub = self._new(sub)
             return space.newtuple(
                 [self._sliced(space, value, 0, pos, value), w_sub,
                  self._sliced(space, value, pos+len(sub), len(value), value)])
@@ -467,6 +484,9 @@
         if pos == -1:
             return space.newtuple([self.EMPTY, self.EMPTY, self])
         else:
+            from pypy.objspace.std.bytearrayobject import W_BytearrayObject
+            if isinstance(self, W_BytearrayObject):
+                w_sub = self._new(sub)
             return space.newtuple(
                 [self._sliced(space, value, 0, pos, value), w_sub,
                  self._sliced(space, value, pos+len(sub), len(value), value)])
@@ -481,7 +501,7 @@
         except OverflowError:
             raise OperationError(space.w_OverflowError,
                                  space.wrap("replace string is too long"))
-        return space.wrap(res)
+        return self._new(res)
 
     @unwrap_spec(maxsplit=int)
     def descr_split(self, space, w_sep=None, maxsplit=-1):
@@ -682,7 +702,7 @@
                 builder.append(self._upper(ch))
             else:
                 builder.append(ch)
-        return space.wrap(builder.build())
+        return self._new(builder.build())
 
     def descr_title(self, space):
         selfval = self._val(space)
@@ -698,7 +718,7 @@
             else:
                 builder.append(self._lower(ch))
             previous_is_cased = self._iscased(ch)
-        return space.wrap(builder.build())
+        return self._new(builder.build())
 
     DEFAULT_NOOP_TABLE = ''.join([chr(i) for i in range(256)])
 
@@ -745,7 +765,7 @@
         num_zeros = width - len(selfval)
         if num_zeros <= 0:
             # cannot return self, in case it is a subclass of str
-            return space.wrap(selfval)
+            return self._new(selfval)
 
         builder = self._builder(width)
         if len(selfval) > 0 and (selfval[0] == '+' or selfval[0] == '-'):
@@ -756,7 +776,7 @@
             start = 0
         builder.append_multiple_char(self._chr('0'), num_zeros)
         builder.append_slice(selfval, start, len(selfval))
-        return space.wrap(builder.build())
+        return self._new(builder.build())
 
     def descr_getnewargs(self, space):
         return space.newtuple([self._new(self._val(space))])
diff --git a/pypy/objspace/std/unicodeobject.py 
b/pypy/objspace/std/unicodeobject.py
--- a/pypy/objspace/std/unicodeobject.py
+++ b/pypy/objspace/std/unicodeobject.py
@@ -300,6 +300,12 @@
 
 
 def unicode_from_encoded_object(space, w_obj, encoding, errors):
+    # explicitly block bytearray on 2.7
+    from .bytearrayobject import W_BytearrayObject
+    if isinstance(w_obj, W_BytearrayObject):
+        raise OperationError(space.w_TypeError,
+                             space.wrap("decoding bytearray is not supported"))
+
     w_retval = decode_object(space, w_obj, encoding, errors)
     if not space.isinstance_w(w_retval, space.w_unicode):
         raise operationerrfmt(space.w_TypeError,
@@ -405,7 +411,6 @@
     __ge__ = interp2app(W_UnicodeObject.descr_ge),
 
     __len__ = interp2app(W_UnicodeObject.descr_len),
-    #__iter__ = interp2app(W_UnicodeObject.descr_iter),
     __contains__ = interp2app(W_UnicodeObject.descr_contains),
 
     __add__ = interp2app(W_UnicodeObject.descr_add),
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to