summaryrefslogtreecommitdiffstats
path: root/Objects/bytesobject.c
diff options
context:
space:
mode:
authorXiang Zhang <angwerzx@126.com>2017-03-14 07:27:01 (GMT)
committerGitHub <noreply@github.com>2017-03-14 07:27:01 (GMT)
commitfaa2cc63e45bc7d7ffab84bebe5a9f4fe065bd96 (patch)
tree4f1e0ff182e1dae2da17be56c69e21f730863f52 /Objects/bytesobject.c
parent388e2568fc919a177df2d2949b575c553aea84ac (diff)
downloadcpython-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.c15
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;
}