[Python-checkins] r86126 - in python/branches/release27-maint: Lib/json/tests/test_unicode.py Misc/NEWS Modules/_json.c

barry.warsaw python-checkins at python.org
Tue Nov 2 22:03:09 CET 2010


Author: barry.warsaw
Date: Tue Nov  2 22:03:09 2010
New Revision: 86126

Log:
Issue 10038.  Restore the Python 2.6 behavior that json.loads() always returns
unicode.  Patch by Patch by Walter Dörwald.


Modified:
   python/branches/release27-maint/Lib/json/tests/test_unicode.py
   python/branches/release27-maint/Misc/NEWS
   python/branches/release27-maint/Modules/_json.c

Modified: python/branches/release27-maint/Lib/json/tests/test_unicode.py
==============================================================================
--- python/branches/release27-maint/Lib/json/tests/test_unicode.py	(original)
+++ python/branches/release27-maint/Lib/json/tests/test_unicode.py	Tue Nov  2 22:03:09 2010
@@ -78,3 +78,5 @@
         self.assertEquals(type(json.loads(u'""')), unicode)
         self.assertEquals(type(json.loads(u'"a"')), unicode)
         self.assertEquals(type(json.loads(u'["a"]')[0]), unicode)
+        # Issue 10038.
+        self.assertEquals(type(json.loads('"foo"')), unicode)

Modified: python/branches/release27-maint/Misc/NEWS
==============================================================================
--- python/branches/release27-maint/Misc/NEWS	(original)
+++ python/branches/release27-maint/Misc/NEWS	Tue Nov  2 22:03:09 2010
@@ -13,11 +13,11 @@
 - Issue #10221: dict.pop(k) now has a key error message that includes the
   missing key (same message d[k] returns for missing keys).
 
-- Issue #10125: Don't segfault when the iterator passed to ``file.writelines()``
-  closes the file.
+- Issue #10125: Don't segfault when the iterator passed to
+  ``file.writelines()`` closes the file.
 
-- Issue #10186: Fix the SyntaxError caret when the offset is equal to the length
-  of the offending line.
+- Issue #10186: Fix the SyntaxError caret when the offset is equal to the
+  length of the offending line.
 
 - Issue #9997: Don't let the name "top" have special significance in scope
   resolution.
@@ -66,10 +66,14 @@
 Library
 -------
 
-- Issue 120176: Wrapped TestSuite subclass does not get __call__ executed
+- Issue #10038: json.loads() on str should always return unicode (regression
+  from Python 2.6).  Patch by Walter Dörwald.
 
-- Issue 6706: asyncore accept() method no longer raises EWOULDBLOCK/ECONNABORTED
-  on incomplete connection attempt but returns None instead.
+- Issue #120176: Wrapped TestSuite subclass does not get __call__ executed.
+
+- Issue #6706: asyncore accept() method no longer raises
+  EWOULDBLOCK/ECONNABORTED on incomplete connection attempt but returns None
+  instead.
 
 - Issue #10266: uu.decode didn't close in_file explicitly when it was given
   as a filename.  Patch by Brian Brazil.

Modified: python/branches/release27-maint/Modules/_json.c
==============================================================================
--- python/branches/release27-maint/Modules/_json.c	(original)
+++ python/branches/release27-maint/Modules/_json.c	Tue Nov  2 22:03:09 2010
@@ -440,7 +440,6 @@
     Py_ssize_t len = PyString_GET_SIZE(pystr);
     Py_ssize_t begin = end - 1;
     Py_ssize_t next;
-    int has_unicode = 0;
     char *buf = PyString_AS_STRING(pystr);
     PyObject *chunks = PyList_New(0);
     if (chunks == NULL) {
@@ -463,9 +462,6 @@
                 raise_errmsg("Invalid control character at", pystr, next);
                 goto bail;
             }
-            else if (c > 0x7f) {
-                has_unicode = 1;
-            }
         }
         if (!(c == '"' || c == '\\')) {
             raise_errmsg("Unterminated string starting at", pystr, begin);
@@ -477,15 +473,10 @@
             if (strchunk == NULL) {
                 goto bail;
             }
-            if (has_unicode) {
-                chunk = PyUnicode_FromEncodedObject(strchunk, encoding, NULL);
-                Py_DECREF(strchunk);
-                if (chunk == NULL) {
-                    goto bail;
-                }
-            }
-            else {
-                chunk = strchunk;
+            chunk = PyUnicode_FromEncodedObject(strchunk, encoding, NULL);
+            Py_DECREF(strchunk);
+            if (chunk == NULL) {
+                goto bail;
             }
             if (PyList_Append(chunks, chunk)) {
                 Py_DECREF(chunk);
@@ -593,21 +584,9 @@
             }
 #endif
         }
-        if (c > 0x7f) {
-            has_unicode = 1;
-        }
-        if (has_unicode) {
-            chunk = PyUnicode_FromUnicode(&c, 1);
-            if (chunk == NULL) {
-                goto bail;
-            }
-        }
-        else {
-            char c_char = Py_CHARMASK(c);
-            chunk = PyString_FromStringAndSize(&c_char, 1);
-            if (chunk == NULL) {
-                goto bail;
-            }
+        chunk = PyUnicode_FromUnicode(&c, 1);
+        if (chunk == NULL) {
+            goto bail;
         }
         if (PyList_Append(chunks, chunk)) {
             Py_DECREF(chunk);


More information about the Python-checkins mailing list