Kaydet (Commit) fa658275 authored tarafından Barry Warsaw's avatar Barry Warsaw

Issue 10038. Restore the Python 2.6 behavior that json.loads() always returns

unicode.  Patch by Patch by Walter Dörwald.
üst 921387ba
...@@ -78,3 +78,5 @@ class TestUnicode(TestCase): ...@@ -78,3 +78,5 @@ class TestUnicode(TestCase):
self.assertEquals(type(json.loads(u'""')), unicode) self.assertEquals(type(json.loads(u'""')), unicode)
self.assertEquals(type(json.loads(u'"a"')), unicode) self.assertEquals(type(json.loads(u'"a"')), unicode)
self.assertEquals(type(json.loads(u'["a"]')[0]), 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 ...@@ -13,11 +13,11 @@ Core and Builtins
- Issue #10221: dict.pop(k) now has a key error message that includes the - Issue #10221: dict.pop(k) now has a key error message that includes the
missing key (same message d[k] returns for missing keys). missing key (same message d[k] returns for missing keys).
- Issue #10125: Don't segfault when the iterator passed to ``file.writelines()`` - Issue #10125: Don't segfault when the iterator passed to
closes the file. ``file.writelines()`` closes the file.
- Issue #10186: Fix the SyntaxError caret when the offset is equal to the length - Issue #10186: Fix the SyntaxError caret when the offset is equal to the
of the offending line. length of the offending line.
- Issue #9997: Don't let the name "top" have special significance in scope - Issue #9997: Don't let the name "top" have special significance in scope
resolution. resolution.
...@@ -66,10 +66,14 @@ Core and Builtins ...@@ -66,10 +66,14 @@ Core and Builtins
Library 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 - Issue #120176: Wrapped TestSuite subclass does not get __call__ executed.
on incomplete connection attempt but returns None instead.
- 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 - Issue #10266: uu.decode didn't close in_file explicitly when it was given
as a filename. Patch by Brian Brazil. as a filename. Patch by Brian Brazil.
......
...@@ -440,7 +440,6 @@ scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict, Py_s ...@@ -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 len = PyString_GET_SIZE(pystr);
Py_ssize_t begin = end - 1; Py_ssize_t begin = end - 1;
Py_ssize_t next; Py_ssize_t next;
int has_unicode = 0;
char *buf = PyString_AS_STRING(pystr); char *buf = PyString_AS_STRING(pystr);
PyObject *chunks = PyList_New(0); PyObject *chunks = PyList_New(0);
if (chunks == NULL) { if (chunks == NULL) {
...@@ -463,9 +462,6 @@ scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict, Py_s ...@@ -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); raise_errmsg("Invalid control character at", pystr, next);
goto bail; goto bail;
} }
else if (c > 0x7f) {
has_unicode = 1;
}
} }
if (!(c == '"' || c == '\\')) { if (!(c == '"' || c == '\\')) {
raise_errmsg("Unterminated string starting at", pystr, begin); 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 ...@@ -477,15 +473,10 @@ scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict, Py_s
if (strchunk == NULL) { if (strchunk == NULL) {
goto bail; goto bail;
} }
if (has_unicode) { chunk = PyUnicode_FromEncodedObject(strchunk, encoding, NULL);
chunk = PyUnicode_FromEncodedObject(strchunk, encoding, NULL); Py_DECREF(strchunk);
Py_DECREF(strchunk); if (chunk == NULL) {
if (chunk == NULL) { goto bail;
goto bail;
}
}
else {
chunk = strchunk;
} }
if (PyList_Append(chunks, chunk)) { if (PyList_Append(chunks, chunk)) {
Py_DECREF(chunk); Py_DECREF(chunk);
...@@ -593,21 +584,9 @@ scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict, Py_s ...@@ -593,21 +584,9 @@ scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict, Py_s
} }
#endif #endif
} }
if (c > 0x7f) { chunk = PyUnicode_FromUnicode(&c, 1);
has_unicode = 1; if (chunk == NULL) {
} goto bail;
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;
}
} }
if (PyList_Append(chunks, chunk)) { if (PyList_Append(chunks, chunk)) {
Py_DECREF(chunk); Py_DECREF(chunk);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment