Merged revisions 84394 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

........
  r84394 | antoine.pitrou | 2010-09-01 17:10:12 +0200 (mer., 01 sept. 2010) | 4 lines

  Issue #7415: PyUnicode_FromEncodedObject() now uses the new buffer API
  properly.  Patch by Stefan Behnel.
........
This commit is contained in:
Antoine Pitrou 2010-09-01 15:16:41 +00:00
parent b83df8f1b7
commit a2983c6734
3 changed files with 30 additions and 27 deletions

View File

@ -58,6 +58,7 @@ David Beazley
Robin Becker Robin Becker
Neal Becker Neal Becker
Bill Bedford Bill Bedford
Stefan Behnel
Reimer Behrends Reimer Behrends
Ben Bell Ben Bell
Thomas Bellman Thomas Bellman

View File

@ -12,6 +12,9 @@ What's New in Python 3.1.3?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #7415: PyUnicode_FromEncodedObject() now uses the new buffer API
properly. Patch by Stefan Behnel.
- Restore GIL in nis_cat in case of error. - Restore GIL in nis_cat in case of error.
- Issue #9712: Fix tokenize on identifiers that start with non-ascii names. - Issue #9712: Fix tokenize on identifiers that start with non-ascii names.

View File

@ -1162,8 +1162,7 @@ PyObject *PyUnicode_FromEncodedObject(register PyObject *obj,
const char *encoding, const char *encoding,
const char *errors) const char *errors)
{ {
const char *s = NULL; Py_buffer buffer;
Py_ssize_t len;
PyObject *v; PyObject *v;
if (obj == NULL) { if (obj == NULL) {
@ -1171,44 +1170,44 @@ PyObject *PyUnicode_FromEncodedObject(register PyObject *obj,
return NULL; return NULL;
} }
/* Decoding bytes objects is the most common case and should be fast */
if (PyBytes_Check(obj)) {
if (PyBytes_GET_SIZE(obj) == 0) {
Py_INCREF(unicode_empty);
v = (PyObject *) unicode_empty;
}
else {
v = PyUnicode_Decode(
PyBytes_AS_STRING(obj), PyBytes_GET_SIZE(obj),
encoding, errors);
}
return v;
}
if (PyUnicode_Check(obj)) { if (PyUnicode_Check(obj)) {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,
"decoding str is not supported"); "decoding str is not supported");
return NULL; return NULL;
} }
/* Coerce object */ /* Retrieve a bytes buffer view through the PEP 3118 buffer interface */
if (PyBytes_Check(obj)) { if (PyObject_GetBuffer(obj, &buffer, PyBUF_SIMPLE) < 0) {
s = PyBytes_AS_STRING(obj); PyErr_Format(PyExc_TypeError,
len = PyBytes_GET_SIZE(obj); "coercing to str: need bytes, bytearray "
} "or buffer-like object, %.80s found",
else if (PyByteArray_Check(obj)) { Py_TYPE(obj)->tp_name);
s = PyByteArray_AS_STRING(obj); return NULL;
len = PyByteArray_GET_SIZE(obj);
}
else if (PyObject_AsCharBuffer(obj, &s, &len)) {
/* Overwrite the error message with something more useful in
case of a TypeError. */
if (PyErr_ExceptionMatches(PyExc_TypeError))
PyErr_Format(PyExc_TypeError,
"coercing to str: need string or buffer, "
"%.80s found",
Py_TYPE(obj)->tp_name);
goto onError;
} }
/* Convert to Unicode */ if (buffer.len == 0) {
if (len == 0) {
Py_INCREF(unicode_empty); Py_INCREF(unicode_empty);
v = (PyObject *)unicode_empty; v = (PyObject *) unicode_empty;
} }
else else
v = PyUnicode_Decode(s, len, encoding, errors); v = PyUnicode_Decode((char*) buffer.buf, buffer.len, encoding, errors);
PyBuffer_Release(&buffer);
return v; return v;
onError:
return NULL;
} }
PyObject *PyUnicode_Decode(const char *s, PyObject *PyUnicode_Decode(const char *s,