[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