[pypy-commit] pypy fix-bytearray-complexity: Fix rstring stuff

waedt noreply at buildbot.pypy.org
Mon Jun 2 19:47:07 CEST 2014


Author: Tyler Wade <wayedt at gmail.com>
Branch: fix-bytearray-complexity
Changeset: r71875:3c26784156b6
Date: 2014-05-26 15:01 -0500
http://bitbucket.org/pypy/pypy/changeset/3c26784156b6/

Log:	Fix rstring stuff

diff --git a/rpython/rlib/rstring.py b/rpython/rlib/rstring.py
--- a/rpython/rlib/rstring.py
+++ b/rpython/rlib/rstring.py
@@ -6,7 +6,7 @@
     SomeInteger, SomeUnicodeCodePoint, SomeUnicodeString, SomePBC)
 from rpython.rtyper.llannotation import SomePtr
 from rpython.rlib import jit
-from rpython.rlib.objectmodel import newlist_hint, specialize
+from rpython.rlib.objectmodel import newlist_hint, resizelist_hint, specialize
 from rpython.rlib.rarithmetic import ovfcheck, LONG_BIT as BLOOM_WIDTH
 from rpython.rlib.buffer import Buffer
 from rpython.rlib.unicodedata import unicodedb_5_2_0 as unicodedb
@@ -18,7 +18,8 @@
 
 @specialize.argtype(0, 1)
 def _get_access_functions(value, other):
-    if isinstance(other, (str, unicode, list)):
+    if (isinstance(other, str) or  isinstance(other, unicode) or
+        isinstance(other, list)):
         def getitem(obj, i):
             return obj[i]
         def getlength(obj):
@@ -36,8 +37,8 @@
         def rfind(obj, other, start, end):
             return search(obj, other, start, end, SEARCH_RFIND)
     else:
-        assert isinstance(value, (str, unicode))
-        assert isinstance(other, (str, unicode))
+        assert isinstance(value, str) or  isinstance(value, unicode)
+        assert isinstance(other, str) or  isinstance(other, unicode)
         def find(obj, other, start, end):
             return obj.find(other, start, end)
         def rfind(obj, other, start, end):
@@ -85,7 +86,7 @@
             i = j + 1
         return res
 
-    if isinstance(value, (list, str)):
+    if isinstance(value, list) or isinstance(value, str):
         assert isinstance(by, str)
     else:
         assert isinstance(by, unicode)
@@ -164,7 +165,7 @@
         res.reverse()
         return res
 
-    if isinstance(value, (list, str)):
+    if isinstance(value, list) or isinstance(value, str):
         assert isinstance(by, str)
     else:
         assert isinstance(by, unicode)
@@ -202,11 +203,12 @@
         assert isinstance(sub, unicode)
         assert isinstance(by, unicode)
         Builder = UnicodeBuilder
-    elif isinstance(input, list):
+    else:
+        assert isinstance(input, list)
         assert isinstance(sub, str)
         assert isinstance(by, str)
         # TODO: ????
-        Builder = StringBuilder
+        Builder = ByteListBuilder
     if maxsplit == 0:
         return input
 
@@ -552,6 +554,35 @@
 class UnicodeBuilder(AbstractStringBuilder):
     tp = unicode
 
+class ByteListBuilder(object):
+    def __init__(self, init_size=INIT_SIZE):
+        self.l = newlist_hint(init_size)
+
+    @specialize.argtype(1)
+    def append(self, s):
+        for c in s:
+            self.l.append(c)
+
+    @specialize.argtype(1)
+    def append_slice(self, s, start, end):
+        assert 0 <= start <= end <= len(s)
+        for c in s[start:end]:
+            self.l.append(c)
+
+    def append_multiple_char(self, c, times):
+        assert isinstance(c, str)
+        self.l.extend([c] * times)
+
+    def append_charpsize(self, s, size):
+        assert size >= 0
+        for i in xrange(size):
+            self.l.append(s[i])
+
+    def build(self):
+        return self.l
+
+    def getlength(self):
+        return len(self.l)
 
 # ------------------------------------------------------------
 # ----------------- implementation details -------------------


More information about the pypy-commit mailing list