[Python-checkins] r88532 - in python/branches/release32-maint: Lib/test/test_unicode.py Misc/NEWS Objects/unicodeobject.c

victor.stinner python-checkins at python.org
Wed Feb 23 13:14:23 CET 2011


Author: victor.stinner
Date: Wed Feb 23 13:14:22 2011
New Revision: 88532

Log:
Merged revisions 88481 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r88481 | victor.stinner | 2011-02-21 22:13:44 +0100 (lun., 21 févr. 2011) | 4 lines
  
  Fix PyUnicode_FromFormatV("%c") for non-BMP char
  
  Issue #10830: Fix PyUnicode_FromFormatV("%c") for non-BMP characters on
  narrow build.
........


Modified:
   python/branches/release32-maint/   (props changed)
   python/branches/release32-maint/Lib/test/test_unicode.py
   python/branches/release32-maint/Misc/NEWS
   python/branches/release32-maint/Objects/unicodeobject.c

Modified: python/branches/release32-maint/Lib/test/test_unicode.py
==============================================================================
--- python/branches/release32-maint/Lib/test/test_unicode.py	(original)
+++ python/branches/release32-maint/Lib/test/test_unicode.py	Wed Feb 23 13:14:22 2011
@@ -1427,7 +1427,7 @@
     # Test PyUnicode_FromFormat()
     def test_from_format(self):
         support.import_module('ctypes')
-        from ctypes import pythonapi, py_object
+        from ctypes import pythonapi, py_object, c_int
         if sys.maxunicode == 65535:
             name = "PyUnicodeUCS2_FromFormat"
         else:
@@ -1452,6 +1452,9 @@
             'string, got a non-ASCII byte: 0xe9$',
             PyUnicode_FromFormat, b'unicode\xe9=%s', 'ascii')
 
+        self.assertEqual(PyUnicode_FromFormat(b'%c', c_int(0xabcd)), '\uabcd')
+        self.assertEqual(PyUnicode_FromFormat(b'%c', c_int(0x10ffff)), '\U0010ffff')
+
         # other tests
         text = PyUnicode_FromFormat(b'%%A:%A', 'abc\xe9\uabcd\U0010ffff')
         self.assertEqual(text, r"%A:'abc\xe9\uabcd\U0010ffff'")

Modified: python/branches/release32-maint/Misc/NEWS
==============================================================================
--- python/branches/release32-maint/Misc/NEWS	(original)
+++ python/branches/release32-maint/Misc/NEWS	Wed Feb 23 13:14:22 2011
@@ -13,6 +13,9 @@
 - Issue #11272: On Windows, input() strips '\r' (and not only '\n'), and
   sys.stdin uses universal newline (replace '\r\n' by '\n').
 
+- Issue #10830: Fix PyUnicode_FromFormatV("%c") for non-BMP characters on
+  narrow build.
+
 - Check for NULL result in PyType_FromSpec.
 
 Library

Modified: python/branches/release32-maint/Objects/unicodeobject.c
==============================================================================
--- python/branches/release32-maint/Objects/unicodeobject.c	(original)
+++ python/branches/release32-maint/Objects/unicodeobject.c	Wed Feb 23 13:14:22 2011
@@ -813,8 +813,19 @@
 
             switch (*f) {
             case 'c':
+            {
+#ifndef Py_UNICODE_WIDE
+                int ordinal = va_arg(count, int);
+                if (ordinal > 0xffff)
+                    n += 2;
+                else
+                    n++;
+#else
                 (void)va_arg(count, int);
-                /* fall through... */
+                n++;
+#endif
+                break;
+            }
             case '%':
                 n++;
                 break;
@@ -992,8 +1003,18 @@
 
             switch (*f) {
             case 'c':
-                *s++ = va_arg(vargs, int);
+            {
+                int ordinal = va_arg(vargs, int);
+#ifndef Py_UNICODE_WIDE
+                if (ordinal > 0xffff) {
+                    ordinal -= 0x10000;
+                    *s++ = 0xD800 | (ordinal >> 10);
+                    *s++ = 0xDC00 | (ordinal & 0x3FF);
+                } else
+#endif
+                *s++ = ordinal;
                 break;
+            }
             case 'd':
                 makefmt(fmt, longflag, longlongflag, size_tflag, zeropad,
                         width, precision, 'd');


More information about the Python-checkins mailing list