[Python-checkins] cpython (merge 3.3 -> default): (Merge 3.3) Issue #17223: Fix PyUnicode_FromUnicode() for string of 1 character

victor.stinner python-checkins at python.org
Tue Feb 26 00:20:36 CET 2013


http://hg.python.org/cpython/rev/a4295ab52427
changeset:   82387:a4295ab52427
parent:      82385:d98a82f4c9bd
parent:      82386:c354afedb866
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Tue Feb 26 00:16:57 2013 +0100
summary:
  (Merge 3.3) Issue #17223: Fix PyUnicode_FromUnicode() for string of 1 character
outside the range U+0000-U+10ffff.

files:
  Misc/NEWS               |   3 +++
  Objects/unicodeobject.c |  14 +++++++-------
  2 files changed, 10 insertions(+), 7 deletions(-)


diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@
 Core and Builtins
 -----------------
 
+- Issue #17223: Fix PyUnicode_FromUnicode() for string of 1 character outside
+  the range U+0000-U+10ffff.
+
 - Issue #17275: Corrected class name in init error messages of the C version of
   BufferedWriter and BufferedRandom.
 
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c
--- a/Objects/unicodeobject.c
+++ b/Objects/unicodeobject.c
@@ -241,7 +241,7 @@
 
 
 static PyObject *
-_PyUnicode_FromUCS1(const unsigned char *s, Py_ssize_t size);
+_PyUnicode_FromUCS1(const Py_UCS1 *s, Py_ssize_t size);
 static PyObject *
 _PyUnicode_FromUCS2(const Py_UCS2 *s, Py_ssize_t size);
 static PyObject *
@@ -432,7 +432,7 @@
 
     if (len == 1) {
         wchar_t ch = _PyUnicode_WSTR(unicode)[0];
-        if (ch < 256) {
+        if ((Py_UCS4)ch < 256) {
             PyObject *latin1_char = get_latin1_char((unsigned char)ch);
             Py_DECREF(unicode);
             return latin1_char;
@@ -1757,7 +1757,7 @@
 
     /* Single character Unicode objects in the Latin-1 range are
        shared when using this constructor */
-    if (size == 1 && *u < 256)
+    if (size == 1 && (Py_UCS4)*u < 256)
         return get_latin1_char((unsigned char)*u);
 
     /* If not empty and not single character, copy the Unicode data
@@ -1865,7 +1865,7 @@
     PyObject *unicode;
     if (size == 1) {
 #ifdef Py_DEBUG
-        assert(s[0] < 128);
+        assert((unsigned char)s[0] < 128);
 #endif
         return get_latin1_char(s[0]);
     }
@@ -1907,7 +1907,7 @@
 }
 
 static PyObject*
-_PyUnicode_FromUCS1(const unsigned char* u, Py_ssize_t size)
+_PyUnicode_FromUCS1(const Py_UCS1* u, Py_ssize_t size)
 {
     PyObject *res;
     unsigned char max_char;
@@ -2792,8 +2792,8 @@
         return NULL;
     }
 
-    if (ordinal < 256)
-        return get_latin1_char(ordinal);
+    if ((Py_UCS4)ordinal < 256)
+        return get_latin1_char((unsigned char)ordinal);
 
     v = PyUnicode_New(1, ordinal);
     if (v == NULL)

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list