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

Reply via email to