[pypy-commit] pypy stdlib-2.7.3: PyUnicode_EncodeDecimal: copy all characters, and ends the buffer with \0.

amauryfa noreply at buildbot.pypy.org
Tue Jun 12 23:22:28 CEST 2012


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: stdlib-2.7.3
Changeset: r55632:ebf8729428b4
Date: 2012-06-12 22:14 +0200
http://bitbucket.org/pypy/pypy/changeset/ebf8729428b4/

Log:	PyUnicode_EncodeDecimal: copy all characters, and ends the buffer
	with \0.

diff --git a/pypy/module/cpyext/test/test_unicodeobject.py b/pypy/module/cpyext/test/test_unicodeobject.py
--- a/pypy/module/cpyext/test/test_unicodeobject.py
+++ b/pypy/module/cpyext/test/test_unicodeobject.py
@@ -198,27 +198,35 @@
 
     def test_encode_decimal(self, space, api):
         with rffi.scoped_unicode2wcharp(u' (12, 35 ABC)') as u:
-            with rffi.scoped_alloc_buffer(13) as buf:
+            with rffi.scoped_alloc_buffer(20) as buf:
                 res = api.PyUnicode_EncodeDecimal(u, 13, buf.raw, None)
-                s = buf.str(13)
+                s = rffi.charp2str(buf.raw)
         assert res == 0
         assert s == ' (12, 35 ABC)'
 
         with rffi.scoped_unicode2wcharp(u' (12, \u1234\u1235)') as u:
-            with rffi.scoped_alloc_buffer(9) as buf:
+            with rffi.scoped_alloc_buffer(20) as buf:
                 res = api.PyUnicode_EncodeDecimal(u, 9, buf.raw, None)
         assert res == -1
         api.PyErr_Clear()
 
         with rffi.scoped_unicode2wcharp(u' (12, \u1234\u1235)') as u:
-            with rffi.scoped_alloc_buffer(9) as buf:
+            with rffi.scoped_alloc_buffer(20) as buf:
                 with rffi.scoped_str2charp("replace") as errors:
                     res = api.PyUnicode_EncodeDecimal(u, 9, buf.raw,
                                                       errors)
-                s = buf.str(9)
+                s = rffi.charp2str(buf.raw)
         assert res == 0
-        assert res == " (12, ??)"
-        api.PyErr_Clear()
+        assert s == " (12, ??)"
+
+        with rffi.scoped_unicode2wcharp(u'12\u1234') as u:
+            with rffi.scoped_alloc_buffer(20) as buf:
+                with rffi.scoped_str2charp("xmlcharrefreplace") as errors:
+                    res = api.PyUnicode_EncodeDecimal(u, 3, buf.raw,
+                                                      errors)
+                s = rffi.charp2str(buf.raw)
+        assert res == 0
+        assert s == "12&#4660;"
 
 
     def test_IS(self, space, api):
diff --git a/pypy/module/cpyext/unicodeobject.py b/pypy/module/cpyext/unicodeobject.py
--- a/pypy/module/cpyext/unicodeobject.py
+++ b/pypy/module/cpyext/unicodeobject.py
@@ -635,8 +635,12 @@
     state = space.fromcache(CodecState)
     result = runicode.unicode_encode_decimal(u, length, errors,
                                              state.encode_error_handler)
-    for i in range(0, length):
+    i = len(result)
+    output[i] = '\0'
+    i -= 1
+    while i >= 0:
         output[i] = result[i]
+        i -= 1
     return 0
 
 @cpython_api([PyObject, PyObject], rffi.INT_real, error=-2)


More information about the pypy-commit mailing list