From 72ea0d82098ec48d60788bb9432a82ef72cfda17 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Wed, 16 Jul 2008 22:57:41 +0000 Subject: #3156: fix consistency in what type bytearray methods accept as items. Also rename confusing "item" parameters to "index". --- Objects/bytearrayobject.c | 78 +++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 40 deletions(-) (limited to 'Objects') diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c index 91a1ed9087..b1f696227f 100644 --- a/Objects/bytearrayobject.c +++ b/Objects/bytearrayobject.c @@ -34,22 +34,32 @@ _getbytevalue(PyObject* arg, int *value) { long face_value; - if (PyInt_Check(arg)) { - face_value = PyInt_AsLong(arg); - if (face_value < 0 || face_value >= 256) { - PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)"); - return 0; - } - } - else if (PyBytes_CheckExact(arg)) { + if (PyBytes_CheckExact(arg)) { if (Py_SIZE(arg) != 1) { PyErr_SetString(PyExc_ValueError, "string must be of size 1"); return 0; } - face_value = Py_CHARMASK(((PyBytesObject*)arg)->ob_sval[0]); + *value = Py_CHARMASK(((PyBytesObject*)arg)->ob_sval[0]); + return 1; + } + else if (PyInt_Check(arg) || PyLong_Check(arg)) { + face_value = PyLong_AsLong(arg); } else { - PyErr_Format(PyExc_TypeError, "an integer or string of size 1 is required"); + PyObject *index = PyNumber_Index(arg); + if (index == NULL) { + PyErr_Format(PyExc_TypeError, + "an integer or string of size 1 is required"); + return 0; + } + face_value = PyLong_AsLong(index); + Py_DECREF(index); + } + if (face_value == -1 && PyErr_Occurred()) + return 0; + + if (face_value < 0 || face_value >= 256) { + PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)"); return 0; } @@ -410,10 +420,10 @@ bytes_getitem(PyByteArrayObject *self, Py_ssize_t i) } static PyObject * -bytes_subscript(PyByteArrayObject *self, PyObject *item) +bytes_subscript(PyByteArrayObject *self, PyObject *index) { - if (PyIndex_Check(item)) { - Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (PyIndex_Check(index)) { + Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return NULL; @@ -427,9 +437,9 @@ bytes_subscript(PyByteArrayObject *self, PyObject *item) } return PyInt_FromLong((unsigned char)(self->ob_bytes[i])); } - else if (PySlice_Check(item)) { + else if (PySlice_Check(index)) { Py_ssize_t start, stop, step, slicelength, cur, i; - if (PySlice_GetIndicesEx((PySliceObject *)item, + if (PySlice_GetIndicesEx((PySliceObject *)index, PyByteArray_GET_SIZE(self), &start, &stop, &step, &slicelength) < 0) { return NULL; @@ -574,13 +584,13 @@ bytes_setitem(PyByteArrayObject *self, Py_ssize_t i, PyObject *value) } static int -bytes_ass_subscript(PyByteArrayObject *self, PyObject *item, PyObject *values) +bytes_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values) { Py_ssize_t start, stop, step, slicelen, needed; char *bytes; - if (PyIndex_Check(item)) { - Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError); + if (PyIndex_Check(index)) { + Py_ssize_t i = PyNumber_AsSsize_t(index, PyExc_IndexError); if (i == -1 && PyErr_Occurred()) return -1; @@ -601,25 +611,15 @@ bytes_ass_subscript(PyByteArrayObject *self, PyObject *item, PyObject *values) slicelen = 1; } else { - Py_ssize_t ival = PyNumber_AsSsize_t(values, PyExc_ValueError); - if (ival == -1 && PyErr_Occurred()) { - int int_value; - /* Also accept str of size 1 in 2.x */ - PyErr_Clear(); - if (!_getbytevalue(values, &int_value)) - return -1; - ival = (int) int_value; - } else if (ival < 0 || ival >= 256) { - PyErr_SetString(PyExc_ValueError, - "byte must be in range(0, 256)"); + int ival; + if (!_getbytevalue(values, &ival)) return -1; - } self->ob_bytes[i] = (char)ival; return 0; } } - else if (PySlice_Check(item)) { - if (PySlice_GetIndicesEx((PySliceObject *)item, + else if (PySlice_Check(index)) { + if (PySlice_GetIndicesEx((PySliceObject *)index, PyByteArray_GET_SIZE(self), &start, &stop, &step, &slicelen) < 0) { return -1; @@ -640,7 +640,7 @@ bytes_ass_subscript(PyByteArrayObject *self, PyObject *item, PyObject *values) values = PyByteArray_FromObject(values); if (values == NULL) return -1; - err = bytes_ass_subscript(self, item, values); + err = bytes_ass_subscript(self, index, values); Py_DECREF(values); return err; } @@ -2594,10 +2594,11 @@ Insert a single item into the bytearray before the given index."); static PyObject * bytes_insert(PyByteArrayObject *self, PyObject *args) { - int value; + PyObject *value; + int ival; Py_ssize_t where, n = Py_SIZE(self); - if (!PyArg_ParseTuple(args, "ni:insert", &where, &value)) + if (!PyArg_ParseTuple(args, "nO:insert", &where, &value)) return NULL; if (n == PY_SSIZE_T_MAX) { @@ -2605,11 +2606,8 @@ bytes_insert(PyByteArrayObject *self, PyObject *args) "cannot add more objects to bytes"); return NULL; } - if (value < 0 || value >= 256) { - PyErr_SetString(PyExc_ValueError, - "byte must be in range(0, 256)"); + if (!_getbytevalue(value, &ival)) return NULL; - } if (PyByteArray_Resize((PyObject *)self, n + 1) < 0) return NULL; @@ -2621,7 +2619,7 @@ bytes_insert(PyByteArrayObject *self, PyObject *args) if (where > n) where = n; memmove(self->ob_bytes + where + 1, self->ob_bytes + where, n - where); - self->ob_bytes[where] = value; + self->ob_bytes[where] = ival; Py_RETURN_NONE; } -- cgit v1.2.1