[pypy-svn] r54625 - in pypy/branch/io-improvements/pypy/rpython: . lltypesystem ootypesystem test

fijal at codespeak.net fijal at codespeak.net
Sat May 10 17:32:33 CEST 2008


Author: fijal
Date: Sat May 10 17:32:32 2008
New Revision: 54625

Modified:
   pypy/branch/io-improvements/pypy/rpython/lltypesystem/rbuilder.py
   pypy/branch/io-improvements/pypy/rpython/ootypesystem/rbuilder.py
   pypy/branch/io-improvements/pypy/rpython/rbuilder.py
   pypy/branch/io-improvements/pypy/rpython/test/test_rbuilder.py
Log:
Support for unicode StringBuilder


Modified: pypy/branch/io-improvements/pypy/rpython/lltypesystem/rbuilder.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/lltypesystem/rbuilder.py	(original)
+++ pypy/branch/io-improvements/pypy/rpython/lltypesystem/rbuilder.py	Sat May 10 17:32:32 2008
@@ -1,7 +1,7 @@
 
 from pypy.rpython.rbuilder import AbstractStringBuilderRepr
 from pypy.rpython.lltypesystem import lltype
-from pypy.rpython.lltypesystem.rstr import STR
+from pypy.rpython.lltypesystem.rstr import STR, UNICODE
 from pypy.rpython.annlowlevel import llstr
 from pypy.rlib import rgc
 
@@ -10,20 +10,22 @@
                               ('used', lltype.Signed),
                               ('buf', lltype.Ptr(STR)))
 
-class StringBuilderRepr(AbstractStringBuilderRepr):
-    lowleveltype = lltype.Ptr(STRINGBUILDER)
-
-    @staticmethod
-    def ll_new(init_size):
-        ll_builder = lltype.malloc(STRINGBUILDER)
+UNICODEBUILDER = lltype.GcStruct('unicodebuilder',
+                                 ('allocated', lltype.Signed),
+                                 ('used', lltype.Signed),
+                                 ('buf', lltype.Ptr(UNICODE)))
+
+class BaseStringBuilderRepr(AbstractStringBuilderRepr):
+    @classmethod
+    def ll_new(cls, init_size):
+        ll_builder = lltype.malloc(cls.lowleveltype.TO)
         ll_builder.allocated = init_size
         ll_builder.used = 0
-        ll_builder.buf = rgc.resizable_buffer_of_shape(STR, init_size)
+        ll_builder.buf = rgc.resizable_buffer_of_shape(cls.basetp, init_size)
         return ll_builder
 
     @staticmethod
-    def ll_append(ll_builder, str):
-        ll_str = llstr(str)
+    def ll_append(ll_builder, ll_str):
         used = ll_builder.used
         lgt = len(ll_str.chars)
         allocated = ll_builder.allocated
@@ -53,4 +55,13 @@
         final_size = ll_builder.used
         return rgc.finish_building_buffer(ll_builder.buf, final_size)
 
+class StringBuilderRepr(BaseStringBuilderRepr):
+    lowleveltype = lltype.Ptr(STRINGBUILDER)
+    basetp = STR
+
+class UnicodeBuilderRepr(BaseStringBuilderRepr):
+    lowleveltype = lltype.Ptr(UNICODEBUILDER)
+    basetp = UNICODE
+
+unicodebuilder_repr = UnicodeBuilderRepr()
 stringbuilder_repr = StringBuilderRepr()

Modified: pypy/branch/io-improvements/pypy/rpython/ootypesystem/rbuilder.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/ootypesystem/rbuilder.py	(original)
+++ pypy/branch/io-improvements/pypy/rpython/ootypesystem/rbuilder.py	Sat May 10 17:32:32 2008
@@ -2,12 +2,10 @@
 from pypy.rpython.rbuilder import AbstractStringBuilderRepr
 from pypy.rpython.ootypesystem import ootype
 
-class StringBuilderRepr(AbstractStringBuilderRepr):
-    lowleveltype = ootype.StringBuilder
-
-    @staticmethod
-    def ll_new(init_size):
-        return ootype.new(ootype.StringBuilder)
+class BaseBuilderRepr(AbstractStringBuilderRepr):
+    @classmethod
+    def ll_new(cls, init_size):
+        return ootype.new(cls.lowleveltype)
 
     @staticmethod
     def ll_append_char(builder, char):
@@ -21,4 +19,11 @@
     def ll_build(builder):
         return builder.ll_build()
 
+class StringBuilderRepr(BaseBuilderRepr):
+    lowleveltype = ootype.StringBuilder
+
+class UnicodeBuilderRepr(BaseBuilderRepr):
+    lowleveltype = ootype.UnicodeBuilder
+
 stringbuilder_repr = StringBuilderRepr()
+unicodebuilder_repr = UnicodeBuilderRepr()

Modified: pypy/branch/io-improvements/pypy/rpython/rbuilder.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/rbuilder.py	(original)
+++ pypy/branch/io-improvements/pypy/rpython/rbuilder.py	Sat May 10 17:32:32 2008
@@ -1,22 +1,31 @@
 
 from pypy.annotation.model import SomeObject, SomeString, s_None,\
-     SomeChar, SomeInteger
+     SomeChar, SomeInteger, SomeUnicodeCodePoint, SomeUnicodeString
 from pypy.rpython.rmodel import Repr
 from pypy.rpython.annlowlevel import llhelper
 from pypy.rpython.lltypesystem import lltype
 
 class SomeStringBuilder(SomeObject):
-    def __init__(self, init_size):
+    def __init__(self, init_size, use_unicode=False):
         self.init_size = init_size
+        self.use_unicode = use_unicode
 
     def method_append(self, s_str):
-        assert isinstance(s_str, (SomeString, SomeChar))
+        if self.use_unicode:
+            assert isinstance(s_str, (SomeUnicodeCodePoint, SomeUnicodeString))
+        else:
+            assert isinstance(s_str, (SomeString, SomeChar))
         return s_None
 
     def method_build(self):
-        return SomeString()
+        if self.use_unicode:
+            return SomeUnicodeString()
+        else:
+            return SomeString()
     
     def rtyper_makerepr(self, rtyper):
+        if self.use_unicode:
+            return rtyper.type_system.rbuilder.unicodebuilder_repr
         return rtyper.type_system.rbuilder.stringbuilder_repr
 
 class AbstractStringBuilderRepr(Repr):
@@ -30,7 +39,7 @@
 
     def rtype_method_append(self, hop):
         vlist = hop.inputargs(*hop.args_r)
-        if isinstance(hop.args_s[1], SomeChar):
+        if isinstance(hop.args_s[1], (SomeChar, SomeUnicodeCodePoint)):
             return hop.gendirectcall(self.ll_append_char, *vlist)
         return hop.gendirectcall(self.ll_append, *vlist)
 

Modified: pypy/branch/io-improvements/pypy/rpython/test/test_rbuilder.py
==============================================================================
--- pypy/branch/io-improvements/pypy/rpython/test/test_rbuilder.py	(original)
+++ pypy/branch/io-improvements/pypy/rpython/test/test_rbuilder.py	Sat May 10 17:32:32 2008
@@ -1,6 +1,6 @@
 
 from pypy.rpython.test.tool import BaseRtypingTest, LLRtypeMixin, OORtypeMixin
-from pypy.rlib.rstring import StringBuilder
+from pypy.rlib.rstring import StringBuilder, UnicodeBuilder
 
 class BaseTestStringBuilder(BaseRtypingTest):
     def test_simple(self):
@@ -22,6 +22,18 @@
         res = self.ll_to_string(self.interpret(func, []))
         assert res == "abcddefgrty"
 
+    def test_unicode(self):
+        def func():
+            s = UnicodeBuilder()
+            s.append(u'a')
+            s.append(u'abc')
+            s.append(u'abcdef')
+            return s.build()
+        res = self.ll_to_unicode(self.interpret(func, []))
+        assert res == 'aabcabcdef'
+        assert isinstance(res, unicode)
+
+
 class TestLLtype(BaseTestStringBuilder, LLRtypeMixin):
     pass
 



More information about the Pypy-commit mailing list