summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBarry Warsaw <barry@python.org>2010-11-02 21:03:09 +0000
committerBarry Warsaw <barry@python.org>2010-11-02 21:03:09 +0000
commitfa6582752a19f38f8c666d36122c7fc450c2dcf5 (patch)
treef73e936743e00deddcff54c112dbcc3415599b89
parent921387ba0e5b41d563c7757858900187bd36609d (diff)
downloadcpython-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.py2
-rw-r--r--Misc/NEWS18
-rw-r--r--Modules/_json.c35
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)
diff --git a/Misc/NEWS b/Misc/NEWS
index 720ecc1212..c39dd86da0 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 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);