Issue #10211 : Buffer object should support the new buffer interface.

This commit is contained in:
Kristján Valur Jónsson 2013-03-19 16:50:51 -07:00
parent acb6e85808
commit 1d108bc714
2 changed files with 21 additions and 2 deletions

View File

@ -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",

View File

@ -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 */
};
};