mirror of
https://github.com/python/cpython.git
synced 2025-07-23 03:05:38 +00:00
Remove the simple slicing API. All slicing is now done with slice objects.
This commit is contained in:
parent
582b586617
commit
d2cf20eea2
32 changed files with 78 additions and 810 deletions
|
@ -464,28 +464,6 @@ buffer_item(PyBufferObject *self, Py_ssize_t idx)
|
|||
return ob;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
buffer_slice(PyBufferObject *self, Py_ssize_t left, Py_ssize_t right)
|
||||
{
|
||||
PyObject *ob;
|
||||
PyBuffer view;
|
||||
if (!get_buf(self, &view, PyBUF_SIMPLE))
|
||||
return NULL;
|
||||
if (left < 0)
|
||||
left = 0;
|
||||
if (right < 0)
|
||||
right = 0;
|
||||
if (right > view.len)
|
||||
right = view.len;
|
||||
if (right < left)
|
||||
right = left;
|
||||
/* XXX(nnorwitz): is it possible to access unitialized memory? */
|
||||
ob = PyBytes_FromStringAndSize((char *)view.buf + left,
|
||||
right - left);
|
||||
PyObject_ReleaseBuffer((PyObject *)self, &view);
|
||||
return ob;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
buffer_subscript(PyBufferObject *self, PyObject *item)
|
||||
{
|
||||
|
@ -604,62 +582,6 @@ buffer_ass_item(PyBufferObject *self, Py_ssize_t idx, PyObject *other)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
buffer_ass_slice(PyBufferObject *self, Py_ssize_t left, Py_ssize_t right,
|
||||
PyObject *other)
|
||||
{
|
||||
PyBufferProcs *pb;
|
||||
PyBuffer v1, v2;
|
||||
Py_ssize_t slice_len;
|
||||
|
||||
pb = other ? other->ob_type->tp_as_buffer : NULL;
|
||||
if (pb == NULL ||
|
||||
pb->bf_getbuffer == NULL) {
|
||||
PyErr_BadArgument();
|
||||
return -1;
|
||||
}
|
||||
if (!get_buf(self, &v1, PyBUF_SIMPLE))
|
||||
return -1;
|
||||
|
||||
if (self->b_readonly || v1.readonly) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"buffer is read-only");
|
||||
PyObject_ReleaseBuffer((PyObject *)self, &v1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((*pb->bf_getbuffer)(other, &v2, PyBUF_SIMPLE) < 0) {
|
||||
PyObject_ReleaseBuffer((PyObject *)self, &v1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (left < 0)
|
||||
left = 0;
|
||||
else if (left > v1.len)
|
||||
left = v1.len;
|
||||
if (right < left)
|
||||
right = left;
|
||||
else if (right > v1.len)
|
||||
right = v1.len;
|
||||
slice_len = right - left;
|
||||
|
||||
if (v2.len != slice_len) {
|
||||
PyErr_SetString(
|
||||
PyExc_TypeError,
|
||||
"right operand length must match slice length");
|
||||
PyObject_ReleaseBuffer((PyObject *)self, &v1);
|
||||
PyObject_ReleaseBuffer(other, &v2);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (slice_len)
|
||||
memcpy((char *)v1.buf + left, v2.buf, slice_len);
|
||||
|
||||
PyObject_ReleaseBuffer((PyObject *)self, &v1);
|
||||
PyObject_ReleaseBuffer(other, &v2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
buffer_ass_subscript(PyBufferObject *self, PyObject *item, PyObject *value)
|
||||
{
|
||||
|
@ -743,9 +665,9 @@ static PySequenceMethods buffer_as_sequence = {
|
|||
(binaryfunc)buffer_concat, /*sq_concat*/
|
||||
(ssizeargfunc)buffer_repeat, /*sq_repeat*/
|
||||
(ssizeargfunc)buffer_item, /*sq_item*/
|
||||
(ssizessizeargfunc)buffer_slice, /*sq_slice*/
|
||||
0, /*sq_slice*/
|
||||
(ssizeobjargproc)buffer_ass_item, /*sq_ass_item*/
|
||||
(ssizessizeobjargproc)buffer_ass_slice, /*sq_ass_slice*/
|
||||
0, /*sq_ass_slice*/
|
||||
};
|
||||
|
||||
static PyMappingMethods buffer_as_mapping = {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue