Merged revisions 65041 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/trunk

........
  r65041 | georg.brandl | 2008-07-17 00:57:41 +0200 (Thu, 17 Jul 2008) | 3 lines

  #3156: fix consistency in what type bytearray methods accept as items.
  Also rename confusing "item" parameters to "index".
........
This commit is contained in:
Georg Brandl 2008-07-16 23:15:30 +00:00
parent 01ca04cc49
commit 9a54d7c350
2 changed files with 57 additions and 62 deletions

View file

@ -36,12 +36,19 @@ _getbytevalue(PyObject* arg, int *value)
if (PyLong_Check(arg)) {
face_value = PyLong_AsLong(arg);
if (face_value < 0 || face_value >= 256) {
PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
} else {
PyObject *index = PyNumber_Index(arg);
if (index == NULL) {
PyErr_Format(PyExc_TypeError, "an integer is required");
return 0;
}
} else {
PyErr_Format(PyExc_TypeError, "an integer is required");
face_value = PyLong_AsLong(index);
Py_DECREF(index);
}
if (face_value < 0 || face_value >= 256) {
/* this includes the OverflowError in case the long is too large */
PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
return 0;
}
@ -358,10 +365,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;
@ -375,9 +382,9 @@ bytes_subscript(PyByteArrayObject *self, PyObject *item)
}
return PyLong_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;
@ -501,7 +508,7 @@ bytes_setslice(PyByteArrayObject *self, Py_ssize_t lo, Py_ssize_t hi,
static int
bytes_setitem(PyByteArrayObject *self, Py_ssize_t i, PyObject *value)
{
Py_ssize_t ival;
int ival;
if (i < 0)
i += Py_SIZE(self);
@ -514,27 +521,21 @@ bytes_setitem(PyByteArrayObject *self, Py_ssize_t i, PyObject *value)
if (value == NULL)
return bytes_setslice(self, i, i+1, NULL);
ival = PyNumber_AsSsize_t(value, PyExc_ValueError);
if (ival == -1 && PyErr_Occurred())
if (!_getbytevalue(value, &ival))
return -1;
if (ival < 0 || ival >= 256) {
PyErr_SetString(PyExc_ValueError, "byte must be in range(0, 256)");
return -1;
}
self->ob_bytes[i] = ival;
return 0;
}
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;
@ -555,20 +556,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 ival;
if (!_getbytevalue(values, &ival))
return -1;
if (ival < 0 || ival >= 256) {
PyErr_SetString(PyExc_ValueError,
"byte must be in range(0, 256)");
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;
@ -589,7 +585,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;
}
@ -789,7 +785,7 @@ bytes_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
/* Run the iterator to exhaustion */
for (;;) {
PyObject *item;
Py_ssize_t value;
int rc, value;
/* Get the next item */
item = iternext(it);
@ -803,18 +799,11 @@ bytes_init(PyByteArrayObject *self, PyObject *args, PyObject *kwds)
}
/* Interpret it as an int (__index__) */
value = PyNumber_AsSsize_t(item, PyExc_ValueError);
rc = _getbytevalue(item, &value);
Py_DECREF(item);
if (value == -1 && PyErr_Occurred())
if (!rc)
goto error;
/* Range check */
if (value < 0 || value >= 256) {
PyErr_SetString(PyExc_ValueError,
"bytes must be in range(0, 256)");
goto error;
}
/* Append the byte */
if (Py_SIZE(self) < self->ob_alloc)
Py_SIZE(self)++;
@ -2517,10 +2506,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) {
@ -2528,11 +2518,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;
@ -2544,7 +2531,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;
}