]> granicus.if.org Git - python/commitdiff
Issue 10038. Restore the Python 2.6 behavior that json.loads() always returns
authorBarry Warsaw <barry@python.org>
Tue, 2 Nov 2010 21:03:09 +0000 (21:03 +0000)
committerBarry Warsaw <barry@python.org>
Tue, 2 Nov 2010 21:03:09 +0000 (21:03 +0000)
unicode.  Patch by Patch by Walter Dörwald.

Lib/json/tests/test_unicode.py
Misc/NEWS
Modules/_json.c

index 13759f8a3f93b37d0a1ba26f64c0b63fb6a227d0..6aaed3f37e1117f391bbb291cd54ba3fc9665ee6 100644 (file)
@@ -78,3 +78,5 @@ class TestUnicode(TestCase):
         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)
index 720ecc12125d61817d64a53c2de6450f837e87b2..c39dd86da07a1138646b8fbc8266b1bced2c485b 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,11 +13,11 @@ Core and Builtins
 - 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 @@ Core and Builtins
 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.
index de7e1711e6b5ae91deead461acf03588a9160f20..12ddea2bce8d6ccd41af94e1463252bd3c5d48ff 100644 (file)
@@ -440,7 +440,6 @@ scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict, Py_s
     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 @@ scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict, Py_s
                 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 @@ scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict, Py_s
             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 @@ scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict, Py_s
             }
 #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);