[pypy-commit] pypy default: Separate W_StringBuilder and W_UnicodeBuilder
rlamy
pypy.commits at gmail.com
Sun May 13 22:58:18 EDT 2018
Author: Ronan Lamy <ronan.lamy at gmail.com>
Branch:
Changeset: r94551:f5577200d77d
Date: 2018-05-14 03:31 +0100
http://bitbucket.org/pypy/pypy/changeset/f5577200d77d/
Log: Separate W_StringBuilder and 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
@@ -6,56 +6,90 @@
from rpython.tool.sourcetools import func_with_new_name
-def create_builder(name, strtype, builder_cls, newmethod):
- if strtype is str:
- unwrap = 'bytes'
- else:
- unwrap = unicode
- class W_Builder(W_Root):
- def __init__(self, space, size):
- if size < 0:
- self.builder = builder_cls()
- else:
- self.builder = builder_cls(size)
+class W_StringBuilder(W_Root):
+ def __init__(self, space, size):
+ if size < 0:
+ self.builder = StringBuilder()
+ else:
+ self.builder = StringBuilder(size)
- @unwrap_spec(size=int)
- def descr__new__(space, w_subtype, size=-1):
- return W_Builder(space, size)
+ @unwrap_spec(size=int)
+ def descr__new__(space, w_subtype, size=-1):
+ return W_StringBuilder(space, size)
- @unwrap_spec(s=unwrap)
- def descr_append(self, space, s):
- self.builder.append(s)
+ @unwrap_spec(s='bytes')
+ def descr_append(self, space, s):
+ self.builder.append(s)
- @unwrap_spec(s=unwrap, start=int, end=int)
- def descr_append_slice(self, space, s, start, end):
- if not 0 <= start <= end <= len(s):
- raise oefmt(space.w_ValueError, "bad start/stop")
- self.builder.append_slice(s, start, end)
+ @unwrap_spec(s='bytes', start=int, end=int)
+ def descr_append_slice(self, space, s, start, end):
+ if not 0 <= start <= end <= len(s):
+ raise oefmt(space.w_ValueError, "bad start/stop")
+ self.builder.append_slice(s, start, end)
- def descr_build(self, space):
- w_s = getattr(space, newmethod)(self.builder.build())
- # after build(), we can continue to append more strings
- # to the same builder. This is supported since
- # 2ff5087aca28 in RPython.
- return w_s
+ def descr_build(self, space):
+ w_s = space.newbytes(self.builder.build())
+ # after build(), we can continue to append more strings
+ # to the same builder. This is supported since
+ # 2ff5087aca28 in RPython.
+ return w_s
- def descr_len(self, space):
- if self.builder is None:
- raise oefmt(space.w_ValueError, "no length of built builder")
- return space.newint(self.builder.getlength())
+ def descr_len(self, space):
+ if self.builder is None:
+ raise oefmt(space.w_ValueError, "no length of built builder")
+ return space.newint(self.builder.getlength())
- W_Builder.__name__ = "W_%s" % name
- W_Builder.typedef = TypeDef(name,
- __new__ = interp2app(func_with_new_name(
- W_Builder.descr__new__.im_func,
- '%s_new' % (name,))),
- append = interp2app(W_Builder.descr_append),
- append_slice = interp2app(W_Builder.descr_append_slice),
- build = interp2app(W_Builder.descr_build),
- __len__ = interp2app(W_Builder.descr_len),
- )
- W_Builder.typedef.acceptable_as_base_class = False
- return W_Builder
+W_StringBuilder.typedef = TypeDef("StringBuilder",
+ __new__ = interp2app(func_with_new_name(
+ W_StringBuilder.descr__new__.im_func,
+ 'StringBuilder_new')),
+ append = interp2app(W_StringBuilder.descr_append),
+ append_slice = interp2app(W_StringBuilder.descr_append_slice),
+ build = interp2app(W_StringBuilder.descr_build),
+ __len__ = interp2app(W_StringBuilder.descr_len),
+)
+W_StringBuilder.typedef.acceptable_as_base_class = False
-W_StringBuilder = create_builder("StringBuilder", str, StringBuilder, "newbytes")
-W_UnicodeBuilder = create_builder("UnicodeBuilder", unicode, UnicodeBuilder, "newunicode")
+class W_UnicodeBuilder(W_Root):
+ def __init__(self, space, size):
+ if size < 0:
+ self.builder = UnicodeBuilder()
+ else:
+ self.builder = UnicodeBuilder(size)
+
+ @unwrap_spec(size=int)
+ def descr__new__(space, w_subtype, size=-1):
+ return W_UnicodeBuilder(space, size)
+
+ @unwrap_spec(s=unicode)
+ def descr_append(self, space, s):
+ self.builder.append(s)
+
+ @unwrap_spec(s=unicode, start=int, end=int)
+ def descr_append_slice(self, space, s, start, end):
+ if not 0 <= start <= end <= len(s):
+ raise oefmt(space.w_ValueError, "bad start/stop")
+ self.builder.append_slice(s, start, end)
+
+ def descr_build(self, space):
+ w_s = space.newunicode(self.builder.build())
+ # after build(), we can continue to append more strings
+ # to the same builder. This is supported since
+ # 2ff5087aca28 in RPython.
+ return w_s
+
+ def descr_len(self, space):
+ if self.builder is None:
+ raise oefmt(space.w_ValueError, "no length of built builder")
+ return space.newint(self.builder.getlength())
+
+W_UnicodeBuilder.typedef = TypeDef("UnicodeBuilder",
+ __new__ = interp2app(func_with_new_name(
+ W_UnicodeBuilder.descr__new__.im_func,
+ 'UnicodeBuilder_new')),
+ append = interp2app(W_UnicodeBuilder.descr_append),
+ append_slice = interp2app(W_UnicodeBuilder.descr_append_slice),
+ build = interp2app(W_UnicodeBuilder.descr_build),
+ __len__ = interp2app(W_UnicodeBuilder.descr_len),
+)
+W_UnicodeBuilder.typedef.acceptable_as_base_class = False
More information about the pypy-commit
mailing list