Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r47214:1c76004cedc6 Date: 2011-09-12 11:38 +0200 http://bitbucket.org/pypy/pypy/changeset/1c76004cedc6/
Log: merge heads diff --git a/pypy/module/__pypy__/__init__.py b/pypy/module/__pypy__/__init__.py --- a/pypy/module/__pypy__/__init__.py +++ b/pypy/module/__pypy__/__init__.py @@ -8,6 +8,7 @@ appleveldefs = {} interpleveldefs = { + "StringBuilder": "interp_builders.W_StringBuilder", "UnicodeBuilder": "interp_builders.W_UnicodeBuilder", } diff --git a/pypy/module/__pypy__/interp_builders.py b/pypy/module/__pypy__/interp_builders.py --- a/pypy/module/__pypy__/interp_builders.py +++ b/pypy/module/__pypy__/interp_builders.py @@ -2,49 +2,53 @@ from pypy.interpreter.error import OperationError from pypy.interpreter.gateway import interp2app, unwrap_spec from pypy.interpreter.typedef import TypeDef -from pypy.rlib.rstring import UnicodeBuilder +from pypy.rlib.rstring import UnicodeBuilder, StringBuilder -class W_UnicodeBuilder(Wrappable): - def __init__(self, space, size): - if size < 0: - self.builder = UnicodeBuilder() - else: - self.builder = UnicodeBuilder(size) - self.done = False +def create_builder(name, strtype, builder_cls): + class W_Builder(Wrappable): + def __init__(self, space, size): + if size < 0: + self.builder = builder_cls() + else: + self.builder = builder_cls(size) - def _check_done(self, space): - if self.done: - raise OperationError(space.w_ValueError, space.wrap("Can't operate on a done builder")) + def _check_done(self, space): + if self.builder is None: + raise OperationError(space.w_ValueError, space.wrap("Can't operate on a done builder")) - @unwrap_spec(size=int) - def descr__new__(space, w_subtype, size=-1): - return W_UnicodeBuilder(space, size) + @unwrap_spec(size=int) + def descr__new__(space, w_subtype, size=-1): + return W_Builder(space, size) - @unwrap_spec(s=unicode) - def descr_append(self, space, s): - self._check_done(space) - self.builder.append(s) + @unwrap_spec(s=strtype) + def descr_append(self, space, s): + self._check_done(space) + self.builder.append(s) - @unwrap_spec(s=unicode, start=int, end=int) - def descr_append_slice(self, space, s, start, end): - self._check_done(space) - if not 0 <= start <= end <= len(s): - raise OperationError(space.w_ValueError, space.wrap("bad start/stop")) - self.builder.append_slice(s, start, end) + @unwrap_spec(s=strtype, start=int, end=int) + def descr_append_slice(self, space, s, start, end): + self._check_done(space) + if not 0 <= start <= end <= len(s): + raise OperationError(space.w_ValueError, space.wrap("bad start/stop")) + self.builder.append_slice(s, start, end) - def descr_build(self, space): - self._check_done(space) - w_s = space.wrap(self.builder.build()) - self.done = True - return w_s + def descr_build(self, space): + self._check_done(space) + w_s = space.wrap(self.builder.build()) + self.builder = None + return w_s + W_Builder.__name__ = "W_%s" % name + W_Builder.typedef = TypeDef(name, + __new__ = interp2app(W_Builder.descr__new__.im_func), -W_UnicodeBuilder.typedef = TypeDef("UnicodeBuilder", - __new__ = interp2app(W_UnicodeBuilder.descr__new__.im_func), + append = interp2app(W_Builder.descr_append), + append_slice = interp2app(W_Builder.descr_append_slice), + build = interp2app(W_Builder.descr_build), + ) + W_Builder.typedef.acceptable_as_base_class = False + return W_Builder - append = interp2app(W_UnicodeBuilder.descr_append), - append_slice = interp2app(W_UnicodeBuilder.descr_append_slice), - build = interp2app(W_UnicodeBuilder.descr_build), -) -W_UnicodeBuilder.typedef.acceptable_as_base_class = False +W_StringBuilder = create_builder("StringBuilder", str, StringBuilder) +W_UnicodeBuilder = create_builder("UnicodeBuilder", unicode, UnicodeBuilder) \ No newline at end of file diff --git a/pypy/module/__pypy__/test/test_builders.py b/pypy/module/__pypy__/test/test_builders.py --- a/pypy/module/__pypy__/test/test_builders.py +++ b/pypy/module/__pypy__/test/test_builders.py @@ -31,4 +31,14 @@ raises(ValueError, b.append_slice, u"1", 2, 1) s = b.build() assert s == "cde" - raises(ValueError, b.append_slice, u"abc", 1, 2) \ No newline at end of file + raises(ValueError, b.append_slice, u"abc", 1, 2) + + def test_stringbuilder(self): + from __pypy__.builders import StringBuilder + b = StringBuilder() + b.append("abc") + b.append("123") + b.append("you and me") + s = b.build() + assert s == "abc123you and me" + raises(ValueError, b.build) \ No newline at end of file _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit