bufferobject.c revision 4252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8
12e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 22e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum/* Buffer object implementation */ 32e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 42e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum#include "Python.h" 52e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 62e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 72e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumtypedef struct { 82e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyObject_HEAD 92e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyObject *b_base; 102e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum void *b_ptr; 112e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum int b_size; 124252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int b_offset; 132e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum int b_readonly; 142e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum long b_hash; 152e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} PyBufferObject; 162e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 172e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 184252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauerstatic int 194252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauerget_buf(PyBufferObject *self, void **ptr, int *size) 204252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer{ 214252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (self->b_base == NULL) { 224252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer assert (ptr != NULL); 234252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer *ptr = self->b_ptr; 244252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer *size = self->b_size; 254252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer } 264252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer else { 274252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int count, offset; 284252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer getreadbufferproc proc; 294252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer PyBufferProcs *bp = self->b_base->ob_type->tp_as_buffer; 304252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if ((*bp->bf_getsegcount)(self->b_base, NULL) != 1) { 314252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer PyErr_SetString(PyExc_TypeError, 324252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer "single-segment buffer object expected"); 334252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return 0; 344252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer } 354252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (self->b_readonly) 364252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer proc = bp->bf_getreadbuffer; 374252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer else 384252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer proc = (getreadbufferproc)bp->bf_getwritebuffer; 394252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if ((count = (*proc)(self->b_base, 0, ptr)) < 0) 404252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return 0; 414252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer /* apply constraints to the start/end */ 424252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (self->b_offset > count) 434252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer offset = count; 444252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer else 454252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer offset = self->b_offset; 464252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer (char *)*ptr = (char *)*ptr + offset; 474252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (self->b_size == Py_END_OF_BUFFER) 484252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer *size = count; 494252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer else 504252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer *size = self->b_size; 514252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (offset + *size > count) 524252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer *size = count - offset; 534252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer } 544252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return 1; 554252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer} 564252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer 574252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer 582e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject * 594252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauerbuffer_from_memory(PyObject *base, int size, int offset, void *ptr, 604252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int readonly) 612e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 622e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyBufferObject * b; 632e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 644252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (size < 0 && size != Py_END_OF_BUFFER) { 6549ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum PyErr_SetString(PyExc_ValueError, 6649ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum "size must be zero or positive"); 6749ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum return NULL; 6849ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum } 6949ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum 702e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum b = PyObject_NEW(PyBufferObject, &PyBuffer_Type); 712e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( b == NULL ) 722e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return NULL; 732e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 742e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum Py_XINCREF(base); 752e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum b->b_base = base; 762e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum b->b_ptr = ptr; 772e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum b->b_size = size; 784252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer b->b_offset = offset; 792e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum b->b_readonly = readonly; 802e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum b->b_hash = -1; 812e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 822e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return (PyObject *) b; 832e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 842e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 852e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject * 864252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauerbuffer_from_object(PyObject *base, int size, int offset, int readonly) 872e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 8849ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum if ( offset < 0 ) { 8949ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum PyErr_SetString(PyExc_ValueError, 9049ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum "offset must be zero or positive"); 9149ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum return NULL; 9249ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum } 9349ded3ec004c49088ec26c808f9b7c931a35cf0fGuido van Rossum 944252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer /* if the base object is another buffer, then try to refer to the 954252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer * base object. 96fdc1bd305bcf8d6ebefe98313fa6c310623a0cb9Thomas Heller */ 974252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if ( PyBuffer_Check(base) && (((PyBufferObject *)base)->b_base) ) { 982e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum base = ((PyBufferObject *)base)->b_base; 994252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer offset = ((PyBufferObject *)base)->b_offset + offset; 1004252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer } 101fdc1bd305bcf8d6ebefe98313fa6c310623a0cb9Thomas Heller 1024252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return buffer_from_memory(base, size, offset, NULL, readonly); 1032e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 1042e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 1052e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 1062e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van RossumPyObject * 107799124718ddfbb95440470037d8d7760b821646fFred DrakePyBuffer_FromObject(PyObject *base, int offset, int size) 1082e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 1092e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyBufferProcs *pb = base->ob_type->tp_as_buffer; 1102e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 1112e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( pb == NULL || 1122e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum pb->bf_getreadbuffer == NULL || 1132e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum pb->bf_getsegcount == NULL ) 1142e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum { 1152e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyErr_SetString(PyExc_TypeError, "buffer object expected"); 1162e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return NULL; 1172e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 1182e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 1194252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return buffer_from_object(base, size, offset, 1); 1202e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 1212e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 1222e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van RossumPyObject * 123799124718ddfbb95440470037d8d7760b821646fFred DrakePyBuffer_FromReadWriteObject(PyObject *base, int offset, int size) 1242e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 1252e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyBufferProcs *pb = base->ob_type->tp_as_buffer; 1262e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 1272e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( pb == NULL || 1282e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum pb->bf_getwritebuffer == NULL || 1292e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum pb->bf_getsegcount == NULL ) 1302e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum { 1312e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyErr_SetString(PyExc_TypeError, "buffer object expected"); 1322e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return NULL; 1332e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 1342e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 1354252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return buffer_from_object(base, size, offset, 0); 1362e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 1372e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 1382e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van RossumPyObject * 139799124718ddfbb95440470037d8d7760b821646fFred DrakePyBuffer_FromMemory(void *ptr, int size) 1402e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 1414252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return buffer_from_memory(NULL, size, 0, ptr, 1); 1422e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 1432e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 1442e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van RossumPyObject * 145799124718ddfbb95440470037d8d7760b821646fFred DrakePyBuffer_FromReadWriteMemory(void *ptr, int size) 1462e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 1474252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return buffer_from_memory(NULL, size, 0, ptr, 0); 1482e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 1492e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 1502e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van RossumPyObject * 151799124718ddfbb95440470037d8d7760b821646fFred DrakePyBuffer_New(int size) 1522e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 153cf703f04ad406d905d280a364048d56aa9d21315Moshe Zadka PyObject *o; 1542e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyBufferObject * b; 1552e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 1564574f23115e2c0b35a2e1a4cac0aa7c855144639Fred Drake if (size < 0) { 1574574f23115e2c0b35a2e1a4cac0aa7c855144639Fred Drake PyErr_SetString(PyExc_ValueError, 1584574f23115e2c0b35a2e1a4cac0aa7c855144639Fred Drake "size must be zero or positive"); 1594574f23115e2c0b35a2e1a4cac0aa7c855144639Fred Drake return NULL; 1604574f23115e2c0b35a2e1a4cac0aa7c855144639Fred Drake } 161e3a8e7ed1d221e5c19d0b3cd9796b393bc41dc68Guido van Rossum /* Inline PyObject_New */ 162cf703f04ad406d905d280a364048d56aa9d21315Moshe Zadka o = PyObject_MALLOC(sizeof(*b) + size); 163cf703f04ad406d905d280a364048d56aa9d21315Moshe Zadka if ( o == NULL ) 1644574f23115e2c0b35a2e1a4cac0aa7c855144639Fred Drake return PyErr_NoMemory(); 165cf703f04ad406d905d280a364048d56aa9d21315Moshe Zadka b = (PyBufferObject *) PyObject_INIT(o, &PyBuffer_Type); 1662e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 1672e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum b->b_base = NULL; 1682e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum b->b_ptr = (void *)(b + 1); 1692e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum b->b_size = size; 1704252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer b->b_offset = 0; 1712e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum b->b_readonly = 0; 1722e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum b->b_hash = -1; 1732e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 174cf703f04ad406d905d280a364048d56aa9d21315Moshe Zadka return o; 1752e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 1762e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 1772e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum/* Methods */ 1782e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 179bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossumstatic PyObject * 180bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossumbuffer_new(PyTypeObject *type, PyObject *args, PyObject *kw) 181bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum{ 182bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum PyObject *ob; 183bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum int offset = 0; 184bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum int size = Py_END_OF_BUFFER; 185bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 186bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum if ( !PyArg_ParseTuple(args, "O|ii:buffer", &ob, &offset, &size) ) 187bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum return NULL; 188bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum return PyBuffer_FromObject(ob, offset, size); 189bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum} 190bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 191bea18ccde6bc12e061c21bb6b944379d8b123845Guido van RossumPyDoc_STRVAR(buffer_doc, 192bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum"buffer(object [, offset[, size]])\n\ 193bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum\n\ 194bea18ccde6bc12e061c21bb6b944379d8b123845Guido van RossumCreate a new buffer object which references the given object.\n\ 195bea18ccde6bc12e061c21bb6b944379d8b123845Guido van RossumThe buffer will reference a slice of the target object from the\n\ 196bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossumstart of the object (or at the specified offset). The slice will\n\ 197bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossumextend to the end of the target object (or with the specified size)."); 198bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 199bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 2002e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic void 201799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_dealloc(PyBufferObject *self) 2022e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 2032e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum Py_XDECREF(self->b_base); 204b18618dab7b6b85bb05b084693706e59211fa180Guido van Rossum PyObject_DEL(self); 2052e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 2062e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 2072e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic int 208799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_compare(PyBufferObject *self, PyBufferObject *other) 2092e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 2104252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer void *p1, *p2; 2114252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int len_self, len_other, min_len, cmp; 2124252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer 2134252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (!get_buf(self, &p1, &len_self)) 2144252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return -1; 2154252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (!get_buf(other, &p2, &len_other)) 2164252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return -1; 2174252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer min_len = (len_self < len_other) ? len_self : len_other; 2182e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if (min_len > 0) { 2194252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer cmp = memcmp(p1, p2, min_len); 2202e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if (cmp != 0) 2212e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return cmp; 2222e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 2232e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return (len_self < len_other) ? -1 : (len_self > len_other) ? 1 : 0; 2242e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 2252e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 2262e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject * 227799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_repr(PyBufferObject *self) 2282e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 2292e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum char *status = self->b_readonly ? "read-only" : "read-write"; 2302e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 2312e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( self->b_base == NULL ) 2327ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw return PyString_FromFormat("<%s buffer ptr %p, size %d at %p>", 2337ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw status, 2347ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw self->b_ptr, 2357ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw self->b_size, 2367ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw self); 2372e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum else 2387ce3694a527afe425a2b9df65c049b0ef4e75960Barry Warsaw return PyString_FromFormat( 2394252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer "<%s buffer for %p, size %d, offset %d at %p>", 2402e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum status, 241a44d353e2b6d947d36ab9d36c1fc84335a0878feFred Drake self->b_base, 2422e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum self->b_size, 2434252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer self->b_offset, 244a44d353e2b6d947d36ab9d36c1fc84335a0878feFred Drake self); 2452e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 2462e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 2472e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic long 248799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_hash(PyBufferObject *self) 2492e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 2504252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer void *ptr; 2514252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int size; 2522e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum register int len; 2532e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum register unsigned char *p; 2542e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum register long x; 2552e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 2562e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( self->b_hash != -1 ) 2572e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return self->b_hash; 2582e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 2590eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer /* XXX potential bugs here, a readonly buffer does not imply that the 2600eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer * underlying memory is immutable. b_readonly is a necessary but not 2610eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer * sufficient condition for a buffer to be hashable. Perhaps it would 2620eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer * be better to only allow hashing if the underlying object is known to 2630eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer * be immutable (e.g. PyString_Check() is true). Another idea would 2640eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer * be to call tp_hash on the underlying object and see if it raises 2650eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer * an error. */ 2662e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( !self->b_readonly ) 2672e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum { 2680eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer PyErr_SetString(PyExc_TypeError, 2690eadcd9cbbc3e165f046fa01025e2a76084a8e52Neil Schemenauer "writable buffers are not hashable"); 2702e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return -1; 2712e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 2722e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 2734252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (!get_buf(self, &ptr, &size)) 2744252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return -1; 2754252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer p = (unsigned char *) ptr; 2764252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer len = size; 2772e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum x = *p << 7; 2782e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum while (--len >= 0) 2792e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum x = (1000003*x) ^ *p++; 2804252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer x ^= size; 2812e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if (x == -1) 2822e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum x = -2; 2832e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum self->b_hash = x; 2842e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return x; 2852e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 2862e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 2872e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject * 288799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_str(PyBufferObject *self) 2892e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 2904252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer void *ptr; 2914252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int size; 2924252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (!get_buf(self, &ptr, &size)) 2934252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return NULL; 2944252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return PyString_FromStringAndSize(ptr, size); 2952e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 2962e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 2972e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum/* Sequence methods */ 2982e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 2992e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic int 300799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_length(PyBufferObject *self) 3012e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 3024252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer void *ptr; 3034252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int size; 3044252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (!get_buf(self, &ptr, &size)) 3054252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return -1; 3064252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return size; 3072e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 3082e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 3092e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject * 310799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_concat(PyBufferObject *self, PyObject *other) 3112e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 3122e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyBufferProcs *pb = other->ob_type->tp_as_buffer; 3134252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer void *ptr1, *ptr2; 3144252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer char *p; 3152e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyObject *ob; 3164252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int size, count; 3172e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 3182e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( pb == NULL || 3192e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum pb->bf_getreadbuffer == NULL || 3202e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum pb->bf_getsegcount == NULL ) 3212e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum { 3222e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyErr_BadArgument(); 3232e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return NULL; 3242e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 3252e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) 3262e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum { 3272e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum /* ### use a different exception type/message? */ 328cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum PyErr_SetString(PyExc_TypeError, 329cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum "single-segment buffer object expected"); 3302e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return NULL; 3312e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 3322e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 3334252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (!get_buf(self, &ptr1, &size)) 3344252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return NULL; 3354252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer 3362e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum /* optimize special case */ 3374252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if ( size == 0 ) 3382e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum { 3392e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum Py_INCREF(other); 3402e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return other; 3412e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 3422e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 3434252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 ) 3442e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return NULL; 3452e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 3464252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer ob = PyString_FromStringAndSize(NULL, size + count); 3474252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer p = PyString_AS_STRING(ob); 3484252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer memcpy(p, ptr1, size); 3494252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer memcpy(p + size, ptr2, count); 3502e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 3512e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum /* there is an extra byte in the string object, so this is safe */ 3524252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer p[size + count] = '\0'; 3532e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 3542e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return ob; 3552e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 3562e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 3572e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject * 358799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_repeat(PyBufferObject *self, int count) 3592e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 3602e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyObject *ob; 3612e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum register char *p; 3624252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer void *ptr; 3634252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int size; 3642e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 3652e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( count < 0 ) 3662e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum count = 0; 3674252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (!get_buf(self, &ptr, &size)) 3684252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return NULL; 3692e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum ob = PyString_FromStringAndSize(NULL, size * count); 3702e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( ob == NULL ) 3712e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return NULL; 3722e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 3732e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum p = PyString_AS_STRING(ob); 3742e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum while ( count-- ) 3752e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum { 3762e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum memcpy(p, ptr, size); 3772e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum p += size; 3782e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 3792e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 3802e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum /* there is an extra byte in the string object, so this is safe */ 3812e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum *p = '\0'; 3822e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 3832e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return ob; 3842e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 3852e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 3862e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject * 387799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_item(PyBufferObject *self, int idx) 3882e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 3894252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer void *ptr; 3904252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int size; 3914252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (!get_buf(self, &ptr, &size)) 3924252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return NULL; 3934252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if ( idx < 0 || idx >= size ) { 3942e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyErr_SetString(PyExc_IndexError, "buffer index out of range"); 3952e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return NULL; 3962e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 3974252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return PyString_FromStringAndSize((char *)ptr + idx, 1); 3982e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 3992e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 4002e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyObject * 401799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_slice(PyBufferObject *self, int left, int right) 4022e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 4034252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer void *ptr; 4044252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int size; 4054252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (!get_buf(self, &ptr, &size)) 4064252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return NULL; 4072e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( left < 0 ) 4082e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum left = 0; 4092e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( right < 0 ) 4102e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum right = 0; 4114252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if ( right > size ) 4124252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer right = size; 4132e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( right < left ) 4142e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum right = left; 4154252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return PyString_FromStringAndSize((char *)ptr + left, 416cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum right - left); 4172e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 4182e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 4192e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic int 420799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_ass_item(PyBufferObject *self, int idx, PyObject *other) 4212e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 4222e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyBufferProcs *pb; 4234252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer void *ptr1, *ptr2; 4244252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int size; 4252e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum int count; 4262e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 4272e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( self->b_readonly ) { 4282e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyErr_SetString(PyExc_TypeError, 4292e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum "buffer is read-only"); 4302e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return -1; 4312e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 4322e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 4334252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (!get_buf(self, &ptr1, &size)) 4344252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return -1; 4354252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer 4364252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (idx < 0 || idx >= size) { 4372e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyErr_SetString(PyExc_IndexError, 4382e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum "buffer assignment index out of range"); 4392e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return -1; 4402e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 4412e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 4422e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum pb = other ? other->ob_type->tp_as_buffer : NULL; 4432e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( pb == NULL || 4442e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum pb->bf_getreadbuffer == NULL || 4452e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum pb->bf_getsegcount == NULL ) 4462e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum { 4472e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyErr_BadArgument(); 4482e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return -1; 4492e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 4502e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) 4512e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum { 4522e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum /* ### use a different exception type/message? */ 453cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum PyErr_SetString(PyExc_TypeError, 454cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum "single-segment buffer object expected"); 4552e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return -1; 4562e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 4572e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 4584252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 ) 4592e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return -1; 4602e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( count != 1 ) { 4612e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyErr_SetString(PyExc_TypeError, 4622e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum "right operand must be a single byte"); 4632e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return -1; 4642e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 4652e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 4664252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer ((char *)ptr1)[idx] = *(char *)ptr2; 4672e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return 0; 4682e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 4692e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 4702e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic int 471799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_ass_slice(PyBufferObject *self, int left, int right, PyObject *other) 4722e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 4732e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyBufferProcs *pb; 4744252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer void *ptr1, *ptr2; 4754252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int size; 4762e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum int slice_len; 4772e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum int count; 4782e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 4792e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( self->b_readonly ) { 4802e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyErr_SetString(PyExc_TypeError, 4812e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum "buffer is read-only"); 4822e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return -1; 4832e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 4842e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 4852e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum pb = other ? other->ob_type->tp_as_buffer : NULL; 4862e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( pb == NULL || 4872e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum pb->bf_getreadbuffer == NULL || 4882e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum pb->bf_getsegcount == NULL ) 4892e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum { 4902e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyErr_BadArgument(); 4912e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return -1; 4922e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 4932e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) 4942e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum { 4952e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum /* ### use a different exception type/message? */ 496cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum PyErr_SetString(PyExc_TypeError, 497cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum "single-segment buffer object expected"); 4982e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return -1; 4992e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 5004252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (!get_buf(self, &ptr1, &size)) 5014252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return -1; 5024252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 ) 5032e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return -1; 5042e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 5052e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( left < 0 ) 5062e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum left = 0; 5074252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer else if ( left > size ) 5084252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer left = size; 5092e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( right < left ) 5102e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum right = left; 5114252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer else if ( right > size ) 5124252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer right = size; 5132e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum slice_len = right - left; 5142e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 5152e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( count != slice_len ) { 516cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum PyErr_SetString( 517cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum PyExc_TypeError, 518cd037e7bed8535f11df4be01c040b939c9e2ad60Guido van Rossum "right operand length must match slice length"); 5192e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return -1; 5202e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 5212e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 5222e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( slice_len ) 5234252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer memcpy((char *)ptr1 + left, ptr2, slice_len); 5242e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 5252e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return 0; 5262e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 5272e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 5282e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum/* Buffer methods */ 5292e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 5302e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic int 531799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_getreadbuf(PyBufferObject *self, int idx, void **pp) 5322e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 5334252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int size; 5342e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( idx != 0 ) { 5352e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyErr_SetString(PyExc_SystemError, 5361db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum "accessing non-existent buffer segment"); 5372e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return -1; 5382e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 5394252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (!get_buf(self, pp, &size)) 5404252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return -1; 5414252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return size; 5422e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 5432e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 5442e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic int 545799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_getwritebuf(PyBufferObject *self, int idx, void **pp) 5462e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 5472e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum if ( self->b_readonly ) 5482e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum { 5492e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyErr_SetString(PyExc_TypeError, "buffer is read-only"); 5502e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return -1; 5512e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum } 5522e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return buffer_getreadbuf(self, idx, pp); 5532e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 5542e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 5552e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic int 556799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_getsegcount(PyBufferObject *self, int *lenp) 5572e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum{ 5584252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer void *ptr; 5594252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int size; 5604252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (!get_buf(self, &ptr, &size)) 5614252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return -1; 5624252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (lenp) 5634252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer *lenp = size; 5642e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum return 1; 5652e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum} 5662e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 5671db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossumstatic int 568799124718ddfbb95440470037d8d7760b821646fFred Drakebuffer_getcharbuf(PyBufferObject *self, int idx, const char **pp) 5691db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum{ 5704252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer void *ptr; 5714252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer int size; 5721db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum if ( idx != 0 ) { 5731db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum PyErr_SetString(PyExc_SystemError, 5741db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum "accessing non-existent buffer segment"); 5751db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum return -1; 5761db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum } 5774252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer if (!get_buf(self, &ptr, &size)) 5784252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return -1; 5794252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer *pp = (const char *)ptr; 5804252a7a5d1c0bbc41abeab2ae5ce29f42cd9ace8Neil Schemenauer return size; 5811db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum} 5821db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum 5832e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 5842e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PySequenceMethods buffer_as_sequence = { 5852e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum (inquiry)buffer_length, /*sq_length*/ 5862e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum (binaryfunc)buffer_concat, /*sq_concat*/ 5872e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum (intargfunc)buffer_repeat, /*sq_repeat*/ 5882e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum (intargfunc)buffer_item, /*sq_item*/ 5892e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum (intintargfunc)buffer_slice, /*sq_slice*/ 5902e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum (intobjargproc)buffer_ass_item, /*sq_ass_item*/ 5912e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum (intintobjargproc)buffer_ass_slice, /*sq_ass_slice*/ 5922e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}; 5932e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 5942e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossumstatic PyBufferProcs buffer_as_buffer = { 5952e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum (getreadbufferproc)buffer_getreadbuf, 5962e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum (getwritebufferproc)buffer_getwritebuf, 5972e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum (getsegcountproc)buffer_getsegcount, 5981db7070217d80f0889aed44ceb1f11a82265b3f0Guido van Rossum (getcharbufferproc)buffer_getcharbuf, 5992e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}; 6002e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 6012e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van RossumPyTypeObject PyBuffer_Type = { 6022e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum PyObject_HEAD_INIT(&PyType_Type) 6032e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 0, 6042e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum "buffer", 6052e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum sizeof(PyBufferObject), 6062e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum 0, 6076d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters (destructor)buffer_dealloc, /* tp_dealloc */ 6086d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_print */ 6096d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_getattr */ 6106d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_setattr */ 6116d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters (cmpfunc)buffer_compare, /* tp_compare */ 6126d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters (reprfunc)buffer_repr, /* tp_repr */ 6136d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_as_number */ 6146d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters &buffer_as_sequence, /* tp_as_sequence */ 6156d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_as_mapping */ 6166d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters (hashfunc)buffer_hash, /* tp_hash */ 6176d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_call */ 6186d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters (reprfunc)buffer_str, /* tp_str */ 6196d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters PyObject_GenericGetAttr, /* tp_getattro */ 6206d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters 0, /* tp_setattro */ 6216d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters &buffer_as_buffer, /* tp_as_buffer */ 6226d6c1a35e08b95a83dbe47dbd9e6474daff00354Tim Peters Py_TPFLAGS_DEFAULT, /* tp_flags */ 623bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum buffer_doc, /* tp_doc */ 624bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_traverse */ 625bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_clear */ 626bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_richcompare */ 627bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_weaklistoffset */ 628bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_iter */ 629bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_iternext */ 630bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_methods */ 631bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_members */ 632bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_getset */ 633bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_base */ 634bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_dict */ 635bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_descr_get */ 636bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_descr_set */ 637bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_dictoffset */ 638bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_init */ 639bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum 0, /* tp_alloc */ 640bea18ccde6bc12e061c21bb6b944379d8b123845Guido van Rossum buffer_new, /* tp_new */ 6412e19bd7cc7520052b0c6e3d3da6baf45fb3b5e6bGuido van Rossum}; 642