[pypy-commit] pypy refactor-str-types: Make W_BytesObject inherit StringMethods and let it use the shared __mul__/__rmul__ implementation.
Manuel Jacob
noreply at buildbot.pypy.org
Tue May 28 14:55:34 CEST 2013
Author: Manuel Jacob
Branch: refactor-str-types
Changeset: r64611:82a10bd78400
Date: 2013-05-25 01:18 +0200
http://bitbucket.org/pypy/pypy/changeset/82a10bd78400/
Log: Make W_BytesObject inherit StringMethods and let it use the shared
__mul__/__rmul__ implementation.
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
@@ -41,9 +41,14 @@
def _new(self, value):
return W_BytearrayObject(value)
- def _self_value(self):
+ def _len(self):
+ return len(self.data)
+
+ def _val(self):
return self.data
+W_BytearrayObject.EMPTY = W_BytearrayObject([])
+
bytearray_append = SMM('append', 2)
bytearray_extend = SMM('extend', 2)
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
@@ -14,6 +14,7 @@
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
from rpython.rlib import jit
from rpython.rlib.jit import we_are_jitted
from rpython.rlib.objectmodel import (compute_hash, compute_unique_id,
@@ -52,7 +53,7 @@
return space.unicode_w(decode_object(space, w_self, encoding, errors))
-class W_BytesObject(W_AbstractBytesObject):
+class W_BytesObject(W_AbstractBytesObject, StringMethods):
_immutable_fields_ = ['_value']
def __init__(w_self, str):
@@ -71,6 +72,16 @@
def listview_str(w_self):
return _create_list_from_string(w_self._value)
+ def _new(self, value):
+ return W_BytesObject(value)
+
+ def _len(self):
+ return len(self._value)
+
+ def _val(self):
+ return self._value
+
+
W_StringObject = W_BytesObject
def _create_list_from_string(value):
@@ -361,8 +372,65 @@
__doc__ = '''str(object) -> string
Return a nice string representation of the object.
-If the argument is a string, the return value is the same object.'''
- )
+If the argument is a string, the return value is the same object.''',
+
+# __repr__ = interp2app(W_BytesObject.descr_repr),
+# __str__ = interp2app(W_BytesObject.descr_str),
+
+# __eq__ = interp2app(W_BytesObject.descr_eq),
+# __ne__ = interp2app(W_BytesObject.descr_ne),
+# __lt__ = interp2app(W_BytesObject.descr_lt),
+# __le__ = interp2app(W_BytesObject.descr_le),
+# __gt__ = interp2app(W_BytesObject.descr_gt),
+# __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),
+ __mul__ = interp2app(W_BytesObject.descr_mul),
+ __rmul__ = interp2app(W_BytesObject.descr_mul),
+
+# __getitem__ = interp2app(W_BytesObject.descr_getitem),
+
+# capitalize = interp2app(W_BytesObject.descr_capitalize),
+# center = interp2app(W_BytesObject.descr_center),
+# count = interp2app(W_BytesObject.descr_count),
+# decode = interp2app(W_BytesObject.descr_decode),
+# expandtabs = interp2app(W_BytesObject.descr_expandtabs),
+# find = interp2app(W_BytesObject.descr_find),
+# rfind = interp2app(W_BytesObject.descr_rfind),
+# index = interp2app(W_BytesObject.descr_index),
+# rindex = interp2app(W_BytesObject.descr_rindex),
+# isalnum = interp2app(W_BytesObject.descr_isalnum),
+# isalpha = interp2app(W_BytesObject.descr_isalpha),
+# isdigit = interp2app(W_BytesObject.descr_isdigit),
+# islower = interp2app(W_BytesObject.descr_islower),
+# isspace = interp2app(W_BytesObject.descr_isspace),
+# istitle = interp2app(W_BytesObject.descr_istitle),
+# isupper = interp2app(W_BytesObject.descr_isupper),
+# join = interp2app(W_BytesObject.descr_join),
+# ljust = interp2app(W_BytesObject.descr_ljust),
+# rjust = interp2app(W_BytesObject.descr_rjust),
+# lower = interp2app(W_BytesObject.descr_lower),
+# partition = interp2app(W_BytesObject.descr_partition),
+# rpartition = interp2app(W_BytesObject.descr_rpartition),
+# replace = interp2app(W_BytesObject.descr_replace),
+# split = interp2app(W_BytesObject.descr_split),
+# rsplit = interp2app(W_BytesObject.descr_rsplit),
+# splitlines = interp2app(W_BytesObject.descr_splitlines),
+# startswith = interp2app(W_BytesObject.descr_startswith),
+# endswith = interp2app(W_BytesObject.descr_endswith),
+# strip = interp2app(W_BytesObject.descr_strip),
+# lstrip = interp2app(W_BytesObject.descr_lstrip),
+# rstrip = interp2app(W_BytesObject.descr_rstrip),
+# swapcase = interp2app(W_BytesObject.descr_swapcase),
+# title = interp2app(W_BytesObject.descr_title),
+# translate = interp2app(W_BytesObject.descr_translate),
+# upper = interp2app(W_BytesObject.descr_upper),
+# zfill = interp2app(W_BytesObject.descr_zfill),
+)
str_typedef.registermethods(globals())
@@ -1208,28 +1276,6 @@
else:
return sliced(space, s, start, stop, w_str)
-def mul_string_times(space, w_str, w_times):
- try:
- mul = space.getindex_w(w_times, space.w_OverflowError)
- except OperationError, e:
- if e.match(space, space.w_TypeError):
- raise FailedToImplement
- raise
- if mul <= 0:
- return W_BytesObject.EMPTY
- input = w_str._value
- if len(input) == 1:
- s = input[0] * mul
- else:
- s = input * mul
- return W_BytesObject(s)
-
-def mul__String_ANY(space, w_str, w_times):
- return mul_string_times(space, w_str, w_times)
-
-def mul__ANY_String(space, w_times, w_str):
- return mul_string_times(space, w_str, w_times)
-
def add__String_String(space, w_left, w_right):
right = w_right._value
left = w_left._value
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
@@ -4,7 +4,10 @@
def _new(self, value):
raise NotImplementedError
- def _self_value(self):
+ def _len(self):
+ raise NotImplementedError
+
+ def _val(self):
raise NotImplementedError
def descr_eq(self, space):
@@ -44,7 +47,11 @@
if e.match(space, space.w_TypeError):
return NotImplemented
raise
- return self._new(self._self_value() * times)
+ if times <= 0:
+ return self.EMPTY
+ if self._len() == 1:
+ return self._new(self._val()[0] * times)
+ return self._new(self._val() * times)
def descr_getitem(self, space):
pass
More information about the pypy-commit
mailing list