From fa6582752a19f38f8c666d36122c7fc450c2dcf5 Mon Sep 17 00:00:00 2001 From: Barry Warsaw Date: Tue, 2 Nov 2010 21:03:09 +0000 Subject: [PATCH] =?UTF-8?q?Issue=2010038.=20=20Restore=20the=20Python=202.?= =?UTF-8?q?6=20behavior=20that=20json.loads()=20always=20returns=20unicode?= =?UTF-8?q?.=20=20Patch=20by=20Patch=20by=20Walter=20D=C3=B6rwald.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Lib/json/tests/test_unicode.py | 2 ++ Misc/NEWS | 18 ++++++++++------- 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 13759f8a3f9..6aaed3f37e1 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) diff --git a/Misc/NEWS b/Misc/NEWS index 720ecc12125..c39dd86da07 100644 --- 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. diff --git a/Modules/_json.c b/Modules/_json.c index de7e1711e6b..12ddea2bce8 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);