]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Issue #10211 : Buffer object should support the new buffer interface.
authorKristján Valur Jónsson <sweskman@gmail.com>
Tue, 19 Mar 2013 23:50:51 +0000 (16:50 -0700)
committerKristján Valur Jónsson <sweskman@gmail.com>
Tue, 19 Mar 2013 23:50:51 +0000 (16:50 -0700)
Lib/test/test_buffer.py
Objects/bufferobject.c

index 6bdc34d28eac8740f293cf72329d5d1a6a5f229b..ac8e636ba4011f7355075e562fe6065c4c06bbcb 100644 (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",
index c52f0bc908ee0b9380319683a56232a54898ed50..23b97b23d950f9c96a8ef4ca3265076ea569d7dc 100644 (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 */
-};
+};
\ No newline at end of file