[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}