diff options
| author | Antoine Pitrou <solipsis@pitrou.net> | 2010-09-01 15:10:12 +0000 | 
|---|---|---|
| committer | Antoine Pitrou <solipsis@pitrou.net> | 2010-09-01 15:10:12 +0000 | 
| commit | b0fa831d1e073624d28aa403496f122e2f35697a (patch) | |
| tree | 4aab58985ebc949c482407f29f056e136d73bfb2 /Objects/unicodeobject.c | |
| parent | f68c2a701bbca88da1299efe4aba84699827e791 (diff) | |
| download | cpython-git-b0fa831d1e073624d28aa403496f122e2f35697a.tar.gz | |
Issue #7415: PyUnicode_FromEncodedObject() now uses the new buffer API
properly.  Patch by Stefan Behnel.
Diffstat (limited to 'Objects/unicodeobject.c')
| -rw-r--r-- | Objects/unicodeobject.c | 53 | 
1 files changed, 26 insertions, 27 deletions
diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index 4c4b43c0e1..753b46515c 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -1234,8 +1234,7 @@ PyObject *PyUnicode_FromEncodedObject(register PyObject *obj,                                        const char *encoding,                                        const char *errors)  { -    const char *s = NULL; -    Py_ssize_t len; +    Py_buffer buffer;      PyObject *v;      if (obj == NULL) { @@ -1243,44 +1242,44 @@ PyObject *PyUnicode_FromEncodedObject(register PyObject *obj,          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)) {          PyErr_SetString(PyExc_TypeError,                          "decoding str is not supported");          return NULL;      } -    /* Coerce object */ -    if (PyBytes_Check(obj)) { -        s = PyBytes_AS_STRING(obj); -        len = PyBytes_GET_SIZE(obj); -    } -    else if (PyByteArray_Check(obj)) { -        s = PyByteArray_AS_STRING(obj); -        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 bytes, bytearray or char buffer, " -                         "%.80s found", -                         Py_TYPE(obj)->tp_name); -        goto onError; +    /* Retrieve a bytes buffer view through the PEP 3118 buffer interface */ +    if (PyObject_GetBuffer(obj, &buffer, PyBUF_SIMPLE) < 0) { +        PyErr_Format(PyExc_TypeError, +                     "coercing to str: need bytes, bytearray " +                     "or buffer-like object, %.80s found", +                     Py_TYPE(obj)->tp_name); +        return NULL;      } -    /* Convert to Unicode */ -    if (len == 0) { +    if (buffer.len == 0) {          Py_INCREF(unicode_empty); -        v = (PyObject *)unicode_empty; +        v = (PyObject *) unicode_empty;      }      else -        v = PyUnicode_Decode(s, len, encoding, errors); +        v = PyUnicode_Decode((char*) buffer.buf, buffer.len, encoding, errors); +    PyBuffer_Release(&buffer);      return v; - -  onError: -    return NULL;  }  /* Convert encoding to lower case and replace '_' with '-' in order to  | 
