diff options
author | Barry Warsaw <barry@python.org> | 2010-11-02 21:03:09 +0000 |
---|---|---|
committer | Barry Warsaw <barry@python.org> | 2010-11-02 21:03:09 +0000 |
commit | fa6582752a19f38f8c666d36122c7fc450c2dcf5 (patch) | |
tree | f73e936743e00deddcff54c112dbcc3415599b89 | |
parent | 921387ba0e5b41d563c7757858900187bd36609d (diff) | |
download | cpython-git-fa6582752a19f38f8c666d36122c7fc450c2dcf5.tar.gz |
Issue 10038. Restore the Python 2.6 behavior that json.loads() always returns
unicode. Patch by Patch by Walter Dörwald.
-rw-r--r-- | Lib/json/tests/test_unicode.py | 2 | ||||
-rw-r--r-- | Misc/NEWS | 18 | ||||
-rw-r--r-- | Modules/_json.c | 35 |
3 files changed, 20 insertions, 35 deletions
diff --git a/Lib/json/tests/test_unicode.py b/Lib/json/tests/test_unicode.py index 13759f8a3f..6aaed3f37e 100644 --- a/Lib/json/tests/test_unicode.py +++ b/Lib/json/tests/test_unicode.py @@ -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) @@ -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. diff --git a/Modules/_json.c b/Modules/_json.c index de7e1711e6..12ddea2bce 100644 --- a/Modules/_json.c +++ b/Modules/_json.c @@ -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); |