pb->bf_getsegcount == NULL ) { PyErr_BadArgument(); return -1; } if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) { /* ### use a different exception type/message? */ PyErr_SetString(PyExc_TypeError, "single-segment buffer object expected"); return -1; } if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 ) return -1; if ( count != 1 ) { PyErr_SetString(PyExc_TypeError, "right operand must be a single byte"); return -1; } ((char *)ptr1)[idx] = *(char *)ptr2; return 0;} static intbuffer_ass_slice(PyBufferObject *self, Py_ssize_t left, Py_ssize_t right, PyObject *other){ PyBufferProcs *pb; void *ptr1, *ptr2; Py_ssize_t size; Py_ssize_t slice_len; Py_ssize_t count; if ( self->b_readonly ) { PyErr_SetString(PyExc_TypeError, "buffer is read-only"); return -1; } pb = other ? other->ob_type->tp_as_buffer : NULL; if ( pb == NULL || pb->bf_getreadbuffer == NULL || pb->bf_getsegcount == NULL ) { PyErr_BadArgument(); return -1; } if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) { /* ### use a different exception type/message? */ PyErr_SetString(PyExc_TypeError, "single-segment buffer object expected"); return -1; } if (!get_buf(self, &ptr1, &size, ANY_BUFFER)) return -1; if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 ) return -1; if ( left < 0 ) left = 0; else if ( left > size ) left = size; if ( right < left ) right = left; else if ( right > size ) right = size; slice_len = right - left; if ( count != slice_len ) { PyErr_SetString( PyExc_TypeError, "right operand length must match slice length"); return -1; } if ( slice_len ) memcpy((char *)ptr1 + left, ptr2, slice_len); return 0;} /* Buffer methods */ static Py_ssize_tbuffer_getreadbuf(PyBufferObject *self, Py_ssize_t idx, void **pp){ Py_ssize_t size; if ( idx != 0 ) { PyErr_SetString(PyExc_SystemError, "accessing non-existent buffer segment"); return -1; } if (!get_buf(self, pp, &size, READ_BUFFER)) return -1; return size;} static Py_ssize_tbuffer_getwritebuf(PyBufferObject *self, Py_ssize_t idx, void **pp){ Py_ssize_t size; if ( self->b_readonly ) { PyErr_SetString(PyExc_TypeError, "buffer is read-only"); return -1; } if ( idx != 0 ) { PyErr_SetString(PyExc_SystemError, "accessing non-existent buffer segment"); return -1; } if (!get_buf(self, pp, &size, WRITE_BUFFER)) return -1; return size;} static Py_ssize_tbuffer_getsegcount(PyBufferObject *self, Py_ssize_t *lenp){ void *ptr; Py_ssize_t size; if (!get_buf(self, &ptr, &size, ANY_BUFFER)) return -1; if (lenp) *lenp = size; return 1;} static Py_ssize_tbuffer_getcharbuf(PyBufferObject *self, Py_ssize_t idx, const char **pp){ void *ptr; Py_ssize_t size; if ( idx != 0 ) { PyErr_SetString(PyExc_SystemError, "accessing non-existent buffer segment"); return -1; } if (!get_buf(self, &ptr, &size, CHAR_BUFFER)) return -1; *pp = (const char *)ptr; return size;} static PySequenceMethods buffer_as_sequence = { (lenfunc)buffer_length, /*sq_length*/ (binaryfunc)buffer_concat, /*sq_concat*/ (ssizeargfunc)buffer_repeat, /*sq_repeat*/ (ssizeargfunc)buffer_item, /*sq_item*/ (ssizessizeargfunc)buffer_slice, /*sq_slice*/ (ssizeobjargproc)buffer_ass_item, /*sq_ass_item*/ (ssizessizeobjargproc)buffer_ass_slice, /*sq_ass_slice*/}; static PyBufferProcs buffer_as_buffer = { (readbufferproc)buffer_getreadbuf, (writebufferproc)buffer_getwritebuf, (segcountproc)buffer_getsegcount, (charbufferproc)buffer_getcharbuf,}; PyTypeObject PyBuffer_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, "buffer", sizeof(PyBufferObject), 0, (destructor)buffer_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ (cmpfunc)buffer_compare, /* tp_compare */ (reprfunc)buffer_repr, /* tp_repr */ 0, /* tp_as_number */ &buffer_as_sequence, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)buffer_hash, /* tp_hash */ 0, /* tp_call */ (reprfunc)buffer_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ &buffer_as_buffer, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GETCHARBUFFER, /* tp_flags */ buffer_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ buffer_new, /* tp_new */};Lines 501–706 of 706. Previous lines
pb->bf_getsegcount == NULL ) { PyErr_BadArgument(); return -1; } if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) { /* ### use a different exception type/message? */ PyErr_SetString(PyExc_TypeError, "single-segment buffer object expected"); return -1; } if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 ) return -1; if ( count != 1 ) { PyErr_SetString(PyExc_TypeError, "right operand must be a single byte"); return -1; } ((char *)ptr1)[idx] = *(char *)ptr2; return 0; } static int buffer_ass_slice(PyBufferObject *self, Py_ssize_t left, Py_ssize_t right, PyObject *other) { PyBufferProcs *pb; void *ptr1, *ptr2; Py_ssize_t size; Py_ssize_t slice_len; Py_ssize_t count; if ( self->b_readonly ) { PyErr_SetString(PyExc_TypeError, "buffer is read-only"); return -1; } pb = other ? other->ob_type->tp_as_buffer : NULL; if ( pb == NULL || pb->bf_getreadbuffer == NULL || pb->bf_getsegcount == NULL ) { PyErr_BadArgument(); return -1; } if ( (*pb->bf_getsegcount)(other, NULL) != 1 ) { /* ### use a different exception type/message? */ PyErr_SetString(PyExc_TypeError, "single-segment buffer object expected"); return -1; } if (!get_buf(self, &ptr1, &size, ANY_BUFFER)) return -1; if ( (count = (*pb->bf_getreadbuffer)(other, 0, &ptr2)) < 0 ) return -1; if ( left < 0 ) left = 0; else if ( left > size ) left = size; if ( right < left ) right = left; else if ( right > size ) right = size; slice_len = right - left; if ( count != slice_len ) { PyErr_SetString( PyExc_TypeError, "right operand length must match slice length"); return -1; } if ( slice_len ) memcpy((char *)ptr1 + left, ptr2, slice_len); return 0; } /* Buffer methods */ static Py_ssize_t buffer_getreadbuf(PyBufferObject *self, Py_ssize_t idx, void **pp) { Py_ssize_t size; if ( idx != 0 ) { PyErr_SetString(PyExc_SystemError, "accessing non-existent buffer segment"); return -1; } if (!get_buf(self, pp, &size, READ_BUFFER)) return -1; return size; } static Py_ssize_t buffer_getwritebuf(PyBufferObject *self, Py_ssize_t idx, void **pp) { Py_ssize_t size; if ( self->b_readonly ) { PyErr_SetString(PyExc_TypeError, "buffer is read-only"); return -1; } if ( idx != 0 ) { PyErr_SetString(PyExc_SystemError, "accessing non-existent buffer segment"); return -1; } if (!get_buf(self, pp, &size, WRITE_BUFFER)) return -1; return size; } static Py_ssize_t buffer_getsegcount(PyBufferObject *self, Py_ssize_t *lenp) { void *ptr; Py_ssize_t size; if (!get_buf(self, &ptr, &size, ANY_BUFFER)) return -1; if (lenp) *lenp = size; return 1; } static Py_ssize_t buffer_getcharbuf(PyBufferObject *self, Py_ssize_t idx, const char **pp) { void *ptr; Py_ssize_t size; if ( idx != 0 ) { PyErr_SetString(PyExc_SystemError, "accessing non-existent buffer segment"); return -1; } if (!get_buf(self, &ptr, &size, CHAR_BUFFER)) return -1; *pp = (const char *)ptr; return size; } static PySequenceMethods buffer_as_sequence = { (lenfunc)buffer_length, /*sq_length*/ (binaryfunc)buffer_concat, /*sq_concat*/ (ssizeargfunc)buffer_repeat, /*sq_repeat*/ (ssizeargfunc)buffer_item, /*sq_item*/ (ssizessizeargfunc)buffer_slice, /*sq_slice*/ (ssizeobjargproc)buffer_ass_item, /*sq_ass_item*/ (ssizessizeobjargproc)buffer_ass_slice, /*sq_ass_slice*/ }; static PyBufferProcs buffer_as_buffer = { (readbufferproc)buffer_getreadbuf, (writebufferproc)buffer_getwritebuf, (segcountproc)buffer_getsegcount, (charbufferproc)buffer_getcharbuf, }; PyTypeObject PyBuffer_Type = { PyObject_HEAD_INIT(&PyType_Type) 0, "buffer", sizeof(PyBufferObject), 0, (destructor)buffer_dealloc, /* tp_dealloc */ 0, /* tp_print */ 0, /* tp_getattr */ 0, /* tp_setattr */ (cmpfunc)buffer_compare, /* tp_compare */ (reprfunc)buffer_repr, /* tp_repr */ 0, /* tp_as_number */ &buffer_as_sequence, /* tp_as_sequence */ 0, /* tp_as_mapping */ (hashfunc)buffer_hash, /* tp_hash */ 0, /* tp_call */ (reprfunc)buffer_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ &buffer_as_buffer, /* tp_as_buffer */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GETCHARBUFFER, /* tp_flags */ buffer_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ 0, /* tp_richcompare */ 0, /* tp_weaklistoffset */ 0, /* tp_iter */ 0, /* tp_iternext */ 0, /* tp_methods */ 0, /* tp_members */ 0, /* tp_getset */ 0, /* tp_base */ 0, /* tp_dict */ 0, /* tp_descr_get */ 0, /* tp_descr_set */ 0, /* tp_dictoffset */ 0, /* tp_init */ 0, /* tp_alloc */ buffer_new, /* tp_new */ };