Author: fijal
Branch: unicode-utf8
Changeset: r92888:1b909417f0e0
Date: 2017-10-31 18:17 +0100
http://bitbucket.org/pypy/pypy/changeset/1b909417f0e0/
Log: whack whack whack, fix UnicodeBuilder, so we can make json work
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
@@ -12,7 +12,7 @@
interpleveldefs = {
"StringBuilder": "interp_builders.W_StringBuilder",
- #"UnicodeBuilder": "interp_builders.W_UnicodeBuilder",
+ "UnicodeBuilder": "interp_builders.W_UnicodeBuilder",
}
class TimeModule(MixedModule):
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,60 +2,98 @@
from pypy.interpreter.error import oefmt
from pypy.interpreter.gateway import interp2app, unwrap_spec
from pypy.interpreter.typedef import TypeDef
-from rpython.rlib.rstring import UnicodeBuilder, StringBuilder
+from rpython.rlib.rstring import StringBuilder
+from pypy.objspace.std.unicodeobject import W_UnicodeObject
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 = StringBuilder()
+ else:
+ self.builder = StringBuilder(size)
+
+ @unwrap_spec(size=int)
+ def descr__new__(space, w_subtype, size=-1):
+ return W_UnicodeBuilder(space, size)
+
+ @unwrap_spec(s='utf8')
+ def descr_append(self, space, s):
+ self.builder.append(s)
+
+ @unwrap_spec(start=int, end=int)
+ def descr_append_slice(self, space, w_s, start, end):
+ w_unicode = W_UnicodeObject.convert_arg_to_w_unicode(space, w_s)
+ if not 0 <= start <= end <= w_unicode._len():
+ raise oefmt(space.w_ValueError, "bad start/stop")
+ byte_start = w_unicode._index_to_byte(start)
+ byte_end = w_unicode._index_to_byte(end)
+ self.builder.append_slice(w_unicode._utf8, byte_start, byte_end)
+
+ def descr_build(self, space):
+ w_s = space.newtext(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
diff --git a/pypy/module/cpyext/test/test_bytesobject.py
b/pypy/module/cpyext/test/test_bytesobject.py
--- a/pypy/module/cpyext/test/test_bytesobject.py
+++ b/pypy/module/cpyext/test/test_bytesobject.py
@@ -596,7 +596,7 @@
encoding = rffi.str2charp("latin-1")
w_res = PyString_AsDecodedObject(space, w_str, encoding, None)
rffi.free_charp(encoding)
- assert space.unwrap(w_res) == u"caf\xe9"
+ assert w_res._utf8 == u"caf\xe9".encode('utf8')
def test_eq(self, space):
assert 1 == _PyString_Eq(
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit