[Python-checkins] CVS: python/dist/src/Objects typeobject.c,2.41,2.42
Guido van Rossum
gvanrossum@users.sourceforge.net
Fri, 17 Aug 2001 14:57:49 -0700
Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv11794
Modified Files:
typeobject.c
Log Message:
Address SF bug #442813. The sequence getitem wrappers should do
interpretation of negative indices, since neither the sq_*item slots
nor the slot_ wrappers do this. (Slices are a different story, there
the size wrapping is done too early.)
Index: typeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/typeobject.c,v
retrieving revision 2.41
retrieving revision 2.42
diff -C2 -d -r2.41 -r2.42
*** typeobject.c 2001/08/17 20:32:36 2.41
--- typeobject.c 2001/08/17 21:57:47 2.42
***************
*** 1662,1667 ****
};
static struct wrapperbase tab_getitem_int[] = {
! {"__getitem__", (wrapperfunc)wrap_intargfunc,
"x.__getitem__(i) <==> x[i]"},
{0}
--- 1662,1702 ----
};
+ static int
+ getindex(PyObject *self, PyObject *arg)
+ {
+ int i;
+
+ i = PyInt_AsLong(arg);
+ if (i == -1 && PyErr_Occurred())
+ return -1;
+ if (i < 0) {
+ PySequenceMethods *sq = self->ob_type->tp_as_sequence;
+ if (sq && sq->sq_length) {
+ int n = (*sq->sq_length)(self);
+ if (n < 0)
+ return -1;
+ i += n;
+ }
+ }
+ return i;
+ }
+
+ static PyObject *
+ wrap_sq_item(PyObject *self, PyObject *args, void *wrapped)
+ {
+ intargfunc func = (intargfunc)wrapped;
+ PyObject *arg;
+ int i;
+
+ if (!PyArg_ParseTuple(args, "O", &arg))
+ return NULL;
+ i = getindex(self, arg);
+ if (i == -1 && PyErr_Occurred())
+ return NULL;
+ return (*func)(self, i);
+ }
+
static struct wrapperbase tab_getitem_int[] = {
! {"__getitem__", (wrapperfunc)wrap_sq_item,
"x.__getitem__(i) <==> x[i]"},
{0}
***************
*** 1686,1697 ****
static PyObject *
! wrap_intobjargproc(PyObject *self, PyObject *args, void *wrapped)
{
intobjargproc func = (intobjargproc)wrapped;
int i, res;
! PyObject *value;
! if (!PyArg_ParseTuple(args, "iO", &i, &value))
return NULL;
res = (*func)(self, i, value);
if (res == -1 && PyErr_Occurred())
--- 1721,1735 ----
static PyObject *
! wrap_sq_setitem(PyObject *self, PyObject *args, void *wrapped)
{
intobjargproc func = (intobjargproc)wrapped;
int i, res;
! PyObject *arg, *value;
! if (!PyArg_ParseTuple(args, "OO", &arg, &value))
return NULL;
+ i = getindex(self, arg);
+ if (i == -1 && PyErr_Occurred())
+ return NULL;
res = (*func)(self, i, value);
if (res == -1 && PyErr_Occurred())
***************
*** 1702,1712 ****
static PyObject *
! wrap_delitem_int(PyObject *self, PyObject *args, void *wrapped)
{
intobjargproc func = (intobjargproc)wrapped;
int i, res;
! if (!PyArg_ParseTuple(args, "i", &i))
return NULL;
res = (*func)(self, i, NULL);
if (res == -1 && PyErr_Occurred())
--- 1740,1754 ----
static PyObject *
! wrap_sq_delitem(PyObject *self, PyObject *args, void *wrapped)
{
intobjargproc func = (intobjargproc)wrapped;
int i, res;
+ PyObject *arg;
! if (!PyArg_ParseTuple(args, "O", &arg))
return NULL;
+ i = getindex(self, arg);
+ if (i == -1 && PyErr_Occurred())
+ return NULL;
res = (*func)(self, i, NULL);
if (res == -1 && PyErr_Occurred())
***************
*** 1717,1723 ****
static struct wrapperbase tab_setitem_int[] = {
! {"__setitem__", (wrapperfunc)wrap_intobjargproc,
"x.__setitem__(i, y) <==> x[i]=y"},
! {"__delitem__", (wrapperfunc)wrap_delitem_int,
"x.__delitem__(y) <==> del x[y]"},
{0}
--- 1759,1765 ----
static struct wrapperbase tab_setitem_int[] = {
! {"__setitem__", (wrapperfunc)wrap_sq_setitem,
"x.__setitem__(i, y) <==> x[i]=y"},
! {"__delitem__", (wrapperfunc)wrap_sq_delitem,
"x.__delitem__(y) <==> del x[y]"},
{0}