PageRenderTime 40ms CodeModel.GetById 18ms RepoModel.GetById 0ms app.codeStats 0ms

/pypy/module/__pypy__/interp_builders.py

https://bitbucket.org/pypy/pypy/
Python | 63 lines | 53 code | 10 blank | 0 comment | 5 complexity | 8db3014e8ec83d08e709c3ecfabdf462 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. from pypy.interpreter.baseobjspace import W_Root
  2. from pypy.interpreter.error import oefmt
  3. from pypy.interpreter.gateway import interp2app, unwrap_spec
  4. from pypy.interpreter.typedef import TypeDef
  5. from rpython.rlib.rstring import UnicodeBuilder, StringBuilder
  6. from rpython.tool.sourcetools import func_with_new_name
  7. def create_builder(name, strtype, builder_cls):
  8. class W_Builder(W_Root):
  9. def __init__(self, space, size):
  10. if size < 0:
  11. self.builder = builder_cls()
  12. else:
  13. self.builder = builder_cls(size)
  14. def _check_done(self, space):
  15. if self.builder is None:
  16. raise oefmt(space.w_ValueError,
  17. "Can't operate on a built builder")
  18. @unwrap_spec(size=int)
  19. def descr__new__(space, w_subtype, size=-1):
  20. return W_Builder(space, size)
  21. @unwrap_spec(s=strtype)
  22. def descr_append(self, space, s):
  23. self._check_done(space)
  24. self.builder.append(s)
  25. @unwrap_spec(s=strtype, start=int, end=int)
  26. def descr_append_slice(self, space, s, start, end):
  27. self._check_done(space)
  28. if not 0 <= start <= end <= len(s):
  29. raise oefmt(space.w_ValueError, "bad start/stop")
  30. self.builder.append_slice(s, start, end)
  31. def descr_build(self, space):
  32. self._check_done(space)
  33. w_s = space.wrap(self.builder.build())
  34. self.builder = None
  35. return w_s
  36. def descr_len(self, space):
  37. if self.builder is None:
  38. raise oefmt(space.w_ValueError, "no length of built builder")
  39. return space.wrap(self.builder.getlength())
  40. W_Builder.__name__ = "W_%s" % name
  41. W_Builder.typedef = TypeDef(name,
  42. __new__ = interp2app(func_with_new_name(
  43. W_Builder.descr__new__.im_func,
  44. '%s_new' % (name,))),
  45. append = interp2app(W_Builder.descr_append),
  46. append_slice = interp2app(W_Builder.descr_append_slice),
  47. build = interp2app(W_Builder.descr_build),
  48. __len__ = interp2app(W_Builder.descr_len),
  49. )
  50. W_Builder.typedef.acceptable_as_base_class = False
  51. return W_Builder
  52. W_StringBuilder = create_builder("StringBuilder", str, StringBuilder)
  53. W_UnicodeBuilder = create_builder("UnicodeBuilder", unicode, UnicodeBuilder)