[Python-checkins] python/dist/src/Objects rangeobject.c,2.34,2.35

fdrake@sourceforge.net fdrake@sourceforge.net
Thu, 02 May 2002 12:56:58 -0700


Update of /cvsroot/python/python/dist/src/Objects
In directory usw-pr-cvs1:/tmp/cvs-serv12620/Objects

Modified Files:
	rangeobject.c 
Log Message:
Remove old deprecated features from the xrange object.

Index: rangeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/rangeobject.c,v
retrieving revision 2.34
retrieving revision 2.35
diff -C2 -d -r2.34 -r2.35
*** rangeobject.c	2 May 2002 16:05:27 -0000	2.34
--- rangeobject.c	2 May 2002 19:56:55 -0000	2.35
***************
*** 3,11 ****
  
  #include "Python.h"
- #include "structmember.h"
- #include <string.h>
- 
- #define WARN(msg) if (PyErr_Warn(PyExc_DeprecationWarning, msg) < 0) \
- 			return NULL;
  
  typedef struct {
--- 3,6 ----
***************
*** 14,78 ****
  	long	step;
  	long	len;
- 	int	reps;
- 	long	totlen;
  } rangeobject;
  
- static int
- long_mul(long i, long j, long *kk)
- {
- 	PyObject *a;
- 	PyObject *b;
- 	PyObject *c;
- 	
- 	if ((a = PyInt_FromLong(i)) == NULL)
- 		return 0;
- 	
- 	if ((b = PyInt_FromLong(j)) == NULL)
- 		return 0;
- 	
- 	c = PyNumber_Multiply(a, b);
- 	
- 	Py_DECREF(a);
- 	Py_DECREF(b);
- 	
- 	if (c == NULL)
- 		return 0;
- 
- 	if (!PyInt_Check(c)) {
- 		Py_DECREF(c);
- 		goto overflow;
- 	}
- 
- 	*kk = PyInt_AS_LONG(c);
- 	Py_DECREF(c);
- 
- 	if (*kk > INT_MAX) {
- 	  overflow:
- 		PyErr_SetString(PyExc_OverflowError,
- 				"integer multiplication");
- 		return 0;
- 	}
- 	else
- 		return 1;
- }
- 
  PyObject *
  PyRange_New(long start, long len, long step, int reps)
  {
! 	long totlen = -1;
! 	rangeobject *obj = PyObject_New(rangeobject, &PyRange_Type);
  
  	if (obj == NULL)
  		return NULL;
- 		
- 	if (reps != 1)
- 		WARN("PyRange_New's 'repetitions' argument is deprecated");
  
! 	if (len == 0 || reps <= 0) {
  		start = 0;
  		len = 0;
  		step = 1;
- 		reps = 1;
- 		totlen = 0;
  	}
  	else {
--- 9,33 ----
  	long	step;
  	long	len;
  } rangeobject;
  
  PyObject *
  PyRange_New(long start, long len, long step, int reps)
  {
! 	rangeobject *obj;
! 
! 	if (reps != 1) {
! 		PyErr_SetString(PyExc_ValueError,
! 			"PyRange_New's 'repetitions' argument must be 1");
! 		return NULL;
! 	}
  
+ 	obj = PyObject_New(rangeobject, &PyRange_Type);
  	if (obj == NULL)
  		return NULL;
  
! 	if (len == 0) {
  		start = 0;
  		len = 0;
  		step = 1;
  	}
  	else {
***************
*** 85,121 ****
  			return NULL;
  		}			
- 		if (! long_mul(len, (long) reps, &totlen)) {
- 			if(!PyErr_ExceptionMatches(PyExc_OverflowError))
- 				return NULL;
- 			PyErr_Clear();
- 			totlen = -1;
- 		}
  	}
- 
  	obj->start = start;
  	obj->len   = len;
  	obj->step  = step;
- 	obj->reps  = reps;
- 	obj->totlen = totlen;
  
  	return (PyObject *) obj;
  }
  
- static void
- range_dealloc(rangeobject *r)
- {
- 	PyObject_Del(r);
- }
- 
  static PyObject *
  range_item(rangeobject *r, int i)
  {
! 	if (i < 0 || i >= r->totlen)
! 		if (r->totlen!=-1) {
! 			PyErr_SetString(PyExc_IndexError,
  				"xrange object index out of range");
! 			return NULL;
! 		}
! 
  	return PyInt_FromLong(r->start + (i % r->len) * r->step);
  }
--- 40,59 ----
  			return NULL;
  		}			
  	}
  	obj->start = start;
  	obj->len   = len;
  	obj->step  = step;
  
  	return (PyObject *) obj;
  }
  
  static PyObject *
  range_item(rangeobject *r, int i)
  {
! 	if (i < 0 || i >= r->len) {
! 		PyErr_SetString(PyExc_IndexError,
  				"xrange object index out of range");
! 		return NULL;
! 	}
  	return PyInt_FromLong(r->start + (i % r->len) * r->step);
  }
***************
*** 124,131 ****
  range_length(rangeobject *r)
  {
! 	if (r->totlen == -1)
! 		PyErr_SetString(PyExc_OverflowError,
! 				"xrange object has too many items");
! 	return r->totlen;
  }
  
--- 62,66 ----
  range_length(rangeobject *r)
  {
! 	return r->len;
  }
  
***************
*** 149,353 ****
  					  r->start + r->len * r->step,
  					  r->step);
- 	if (r->reps != 1) {
- 		PyObject *extra = PyString_FromFormat(
- 			"(%s * %d)",
- 			PyString_AS_STRING(rtn), r->reps);
- 		Py_DECREF(rtn);
- 		rtn = extra;
- 	}
  	return rtn;
  }
  
- static PyObject *
- range_repeat(rangeobject *r, int n)
- {
- 	long lreps = 0;
- 
- 	WARN("xrange object multiplication is deprecated; "
- 	     "convert to list instead");
- 
- 	if (n <= 0)
- 		return (PyObject *) PyRange_New(0, 0, 1, 1);
- 
- 	else if (n == 1) {
- 		Py_INCREF(r);
- 		return (PyObject *) r;
- 	}
- 
- 	else if (! long_mul((long) r->reps, (long) n, &lreps))
- 		return NULL;
- 	
- 	else
- 		return (PyObject *) PyRange_New(
- 						r->start,
- 						r->len,
- 						r->step,
- 						(int) lreps);
- }
- 
- static int
- range_compare(rangeobject *r1, rangeobject *r2)
- {
- 
-         if (PyErr_Warn(PyExc_DeprecationWarning,
-         	       "xrange object comparison is deprecated; "
-         	       "convert to list instead") < 0)
-         	return -1;
- 
- 	if (r1->start != r2->start)
- 		return r1->start - r2->start;
- 
- 	else if (r1->step != r2->step)
- 		return r1->step - r2->step;
- 
- 	else if (r1->len != r2->len)
- 		return r1->len - r2->len;
- 
- 	else
- 		return r1->reps - r2->reps;
- }
- 
- static PyObject *
- range_slice(rangeobject *r, int low, int high)
- {
- 	WARN("xrange object slicing is deprecated; "
- 	     "convert to list instead");
- 
- 	if (r->reps != 1) {
- 		PyErr_SetString(PyExc_TypeError,
- 				"cannot slice a replicated xrange");
- 		return NULL;
- 	}
- 	if (low < 0)
- 		low = 0;
- 	else if (low > r->len)
- 		low = r->len;
- 	if (high < 0)
- 		high = 0;
- 	if (high < low)
- 		high = low;
- 	else if (high > r->len)
- 		high = r->len;
- 
- 	if (low == 0 && high == r->len) {
- 		Py_INCREF(r);
- 		return (PyObject *) r;
- 	}
- 
- 	return (PyObject *) PyRange_New(
- 				low * r->step + r->start,
- 				high - low,
- 				r->step,
- 				1);
- }
- 
- static PyObject *
- range_tolist(rangeobject *self, PyObject *args)
- {
- 	PyObject *thelist;
- 	int j;
- 
- 	WARN("xrange.tolist() is deprecated; use list(xrange) instead");
- 
- 	if (self->totlen == -1)
- 		return PyErr_NoMemory();
- 
- 	if ((thelist = PyList_New(self->totlen)) == NULL)
- 		return NULL;
- 
- 	for (j = 0; j < self->totlen; ++j)
- 		if ((PyList_SetItem(thelist, j, (PyObject *) PyInt_FromLong(
- 			self->start + (j % self->len) * self->step))) < 0)
- 			return NULL;
- 
- 	return thelist;
- }
- 
- static PyObject *
- range_get_stop(rangeobject *self, void *closure)
- {
- 	return PyInt_FromLong(self->start + (self->len * self->step));
- }
- 
- static PyMethodDef range_methods[] = {
- 	{"tolist",	(PyCFunction)range_tolist, METH_NOARGS,
-          "tolist() -> list\n"
-          "Return a list object with the same values.\n"
-          "(This method is deprecated; use list() instead.)"},
- 	{NULL,		NULL}
- };
- 
- static PyMemberDef range_members[] = {
- 	{"step",  T_LONG, offsetof(rangeobject, step),  RO,
- 	 "Interval between indexes of the slice; also known as the 'stride'."},
- 	{"start", T_LONG, offsetof(rangeobject, start), RO,
- 	 "First index of the slice."},
- 	{NULL, 0, 0, 0}
- };
- 
- static PyGetSetDef range_getsets[] = {
- 	{"stop", (getter)range_get_stop, NULL,
- 	 ""},
- 	{NULL},
- };
- 
- static PyObject *
- range_getattro(rangeobject *self, PyObject *name)
- {
- 	PyObject *result;
- 	result = PyObject_GenericGetAttr((PyObject *)self, name);
- 	if (result && PyInt_CheckExact(result)) {
- 		WARN("xrange object's 'start', 'stop' and 'step' "
- 		     "attributes are deprecated");
- 	}
- 	return result;
- }
- 
  static PySequenceMethods range_as_sequence = {
! 	(inquiry)range_length,	/*sq_length*/
! 	0,			/*sq_concat*/
! 	(intargfunc)range_repeat, /*sq_repeat*/
! 	(intargfunc)range_item, /*sq_item*/
! 	(intintargfunc)range_slice, /*sq_slice*/
! 	0,			/*sq_ass_item*/
! 	0,			/*sq_ass_slice*/
! 	0, 			/*sq_contains*/
  };
  
  PyTypeObject PyRange_Type = {
  	PyObject_HEAD_INIT(&PyType_Type)
! 	0,			/* Number of items for varobject */
! 	"xrange",		/* Name of this type */
! 	sizeof(rangeobject),	/* Basic object size */
! 	0,			/* Item size for varobject */
! 	(destructor)range_dealloc,		/*tp_dealloc*/
! 	0,					/*tp_print*/
! 	0,					/*tp_getattr*/
! 	0,					/*tp_setattr*/
! 	(cmpfunc)range_compare,			/*tp_compare*/
! 	(reprfunc)range_repr,			/*tp_repr*/
! 	0,					/*tp_as_number*/
! 	&range_as_sequence,			/*tp_as_sequence*/
! 	0,					/*tp_as_mapping*/
! 	0,					/*tp_hash*/
! 	0,					/*tp_call*/
! 	0,					/*tp_str*/
! 	(getattrofunc)range_getattro,		/*tp_getattro*/
! 	0,					/*tp_setattro*/
! 	0,					/*tp_as_buffer*/
! 	Py_TPFLAGS_DEFAULT,			/*tp_flags*/
! 	0,					/* tp_doc */
! 	0,					/* tp_traverse */
! 	0,					/* tp_clear */
! 	0,					/* tp_richcompare */
! 	0,					/* tp_weaklistoffset */
! 	0,					/* tp_iter */
! 	0,					/* tp_iternext */
! 	range_methods,				/* tp_methods */
! 	range_members,				/* tp_members */
! 	range_getsets,				/* tp_getset */
! 	0,					/* tp_base */
! 	0,					/* tp_dict */
  };
- 
- #undef WARN
--- 84,120 ----
  					  r->start + r->len * r->step,
  					  r->step);
  	return rtn;
  }
  
  static PySequenceMethods range_as_sequence = {
! 	(inquiry)range_length,	/* sq_length */
! 	0,			/* sq_concat */
! 	0,			/* sq_repeat */
! 	(intargfunc)range_item, /* sq_item */
! 	0,			/* sq_slice */
  };
  
  PyTypeObject PyRange_Type = {
  	PyObject_HEAD_INIT(&PyType_Type)
! 	0,				/* Number of items for varobject */
! 	"xrange",			/* Name of this type */
! 	sizeof(rangeobject),		/* Basic object size */
! 	0,				/* Item size for varobject */
! 	(destructor)PyObject_Del,	/* tp_dealloc */
! 	0,				/* tp_print */
! 	0,				/* tp_getattr */
! 	0,				/* tp_setattr */
! 	0,				/* tp_compare */
! 	(reprfunc)range_repr,		/* tp_repr */
! 	0,				/* tp_as_number */
! 	&range_as_sequence,		/* tp_as_sequence */
! 	0,				/* tp_as_mapping */
! 	0,				/* tp_hash */
! 	0,				/* tp_call */
! 	0,				/* tp_str */
! 	0,				/* tp_getattro */
! 	0,				/* tp_setattro */
! 	0,				/* tp_as_buffer */
! 	Py_TPFLAGS_DEFAULT,		/* tp_flags */
! 	0,				/* tp_doc */
  };