diff options
author | Kristján Valur Jónsson <sweskman@gmail.com> | 2013-03-19 23:50:51 (GMT) |
---|---|---|
committer | Kristján Valur Jónsson <sweskman@gmail.com> | 2013-03-19 23:50:51 (GMT) |
commit | 1d108bc7148336f01d6df066ba1b27678c9bd1ca (patch) | |
tree | 74a30ae65b7215fe8d0350848f0258156bcf0e70 | |
parent | acb6e85808ec2a4522c1e7cf665c85c02edf16ab (diff) | |
download | cpython-1d108bc7148336f01d6df066ba1b27678c9bd1ca.zip cpython-1d108bc7148336f01d6df066ba1b27678c9bd1ca.tar.gz cpython-1d108bc7148336f01d6df066ba1b27678c9bd1ca.tar.bz2 |
Issue #10211 : Buffer object should support the new buffer interface.
-rw-r--r-- | Lib/test/test_buffer.py | 8 | ||||
-rw-r--r-- | Objects/bufferobject.c | 15 |
2 files changed, 21 insertions, 2 deletions
diff --git a/Lib/test/test_buffer.py b/Lib/test/test_buffer.py index 6bdc34d..ac8e636 100644 --- a/Lib/test/test_buffer.py +++ b/Lib/test/test_buffer.py @@ -21,6 +21,14 @@ class BufferTests(unittest.TestCase): self.assertEqual(b[start:stop:step], s[start:stop:step]) + def test_newbuffer_interface(self): + # Test that the buffer object has the new buffer interface + # as used by the memoryview object + s = "".join(chr(c) for c in list(range(255, -1, -1))) + b = buffer(s) + m = memoryview(b) # Should not raise an exception + self.assertEqual(m.tobytes(), s) + def test_main(): with test_support.check_py3k_warnings(("buffer.. not supported", diff --git a/Objects/bufferobject.c b/Objects/bufferobject.c index c52f0bc..23b97b2 100644 --- a/Objects/bufferobject.c +++ b/Objects/bufferobject.c @@ -802,6 +802,16 @@ buffer_getcharbuf(PyBufferObject *self, Py_ssize_t idx, const char **pp) return size; } +static int buffer_getbuffer(PyBufferObject *self, Py_buffer *buf, int flags) +{ + void *ptr; + Py_ssize_t size; + if (!get_buf(self, &ptr, &size, ANY_BUFFER)) + return -1; + return PyBuffer_FillInfo(buf, (PyObject*)self, ptr, size, + self->b_readonly, flags); +} + static PySequenceMethods buffer_as_sequence = { (lenfunc)buffer_length, /*sq_length*/ (binaryfunc)buffer_concat, /*sq_concat*/ @@ -823,6 +833,7 @@ static PyBufferProcs buffer_as_buffer = { (writebufferproc)buffer_getwritebuf, (segcountproc)buffer_getsegcount, (charbufferproc)buffer_getcharbuf, + (getbufferproc)buffer_getbuffer, }; PyTypeObject PyBuffer_Type = { @@ -845,7 +856,7 @@ PyTypeObject PyBuffer_Type = { PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ &buffer_as_buffer, /* tp_as_buffer */ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GETCHARBUFFER, /* tp_flags */ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GETCHARBUFFER | Py_TPFLAGS_HAVE_NEWBUFFER, /* tp_flags */ buffer_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ @@ -864,4 +875,4 @@ PyTypeObject PyBuffer_Type = { 0, /* tp_init */ 0, /* tp_alloc */ buffer_new, /* tp_new */ -}; +};
\ No newline at end of file |