diff options
author | Xiang Zhang <angwerzx@126.com> | 2017-03-14 07:27:01 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-14 07:27:01 (GMT) |
commit | faa2cc63e45bc7d7ffab84bebe5a9f4fe065bd96 (patch) | |
tree | 4f1e0ff182e1dae2da17be56c69e21f730863f52 /Objects/bytesobject.c | |
parent | 388e2568fc919a177df2d2949b575c553aea84ac (diff) | |
download | cpython-faa2cc63e45bc7d7ffab84bebe5a9f4fe065bd96.zip cpython-faa2cc63e45bc7d7ffab84bebe5a9f4fe065bd96.tar.gz cpython-faa2cc63e45bc7d7ffab84bebe5a9f4fe065bd96.tar.bz2 |
bpo-28856: Let %b format for bytes support objects that follow the buffer protocol (GH-664)
Diffstat (limited to 'Objects/bytesobject.c')
-rw-r--r-- | Objects/bytesobject.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c index 801711f..30c1a7e 100644 --- a/Objects/bytesobject.c +++ b/Objects/bytesobject.c @@ -528,6 +528,8 @@ byte_converter(PyObject *arg, char *p) return 0; } +static PyObject *_PyBytes_FromBuffer(PyObject *x); + static PyObject * format_obj(PyObject *v, const char **pbuf, Py_ssize_t *plen) { @@ -564,8 +566,19 @@ format_obj(PyObject *v, const char **pbuf, Py_ssize_t *plen) *plen = PyBytes_GET_SIZE(result); return result; } + /* does it support buffer protocol? */ + if (PyObject_CheckBuffer(v)) { + /* maybe we can avoid making a copy of the buffer object here? */ + result = _PyBytes_FromBuffer(v); + if (result == NULL) + return NULL; + *pbuf = PyBytes_AS_STRING(result); + *plen = PyBytes_GET_SIZE(result); + return result; + } PyErr_Format(PyExc_TypeError, - "%%b requires bytes, or an object that implements __bytes__, not '%.100s'", + "%%b requires a bytes-like object, " + "or an object that implements __bytes__, not '%.100s'", Py_TYPE(v)->tp_name); return NULL; } |