[pypy-commit] pypy default: merge heads
arigo
noreply at buildbot.pypy.org
Mon Sep 12 11:38:23 CEST 2011
Author: Armin Rigo <arigo at 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
More information about the pypy-commit
mailing list