=== modified file 'Objects/rangeobject.c' --- Objects/rangeobject.c 2008-02-09 04:13:49 +0000 +++ Objects/rangeobject.c 2008-04-10 20:04:34 +0000 @@ -233,6 +233,72 @@ } static PyObject * +range_str(rangeobject *r) +{ + /* construct a string rep of range like */ + + PyObject *tmp, *len, *result, *iter, *one, *zero, *two, *off; + + tmp = PyNumber_Subtract(r->stop, r->start); + len = PyNumber_FloorDivide(tmp, r->step); + one = PyLong_FromLong(1); + two = PyLong_FromLong(2); + zero = PyLong_FromLong(0); + off = PyLong_FromLong(1); + + if ( PyObject_Compare(len,PyLong_FromLong(7)) < 0 ) { + result = PyUnicode_FromString("< "); + iter = PyNumber_Add(r->start,zero); + while( PyObject_Compare(iter,r->stop) < 0 ) { + result = PyUnicode_Concat(result,PyUnicode_FromFormat("%R",iter)); + iter = PyNumber_Add(iter,r->step); + if(PyObject_Compare(iter,r->stop) < 0) + result = PyUnicode_Concat(result,PyUnicode_FromString(", ")); + } + result = PyUnicode_Concat(result,PyUnicode_FromString(" >")); + return result; + } + else + { + if (PyObject_Compare(r->step,zero) > 0) { + if (PyObject_Compare(PyNumber_Add(r->start, + PyNumber_Multiply(len,r->step)), + r->stop) < 0 ) + off = PyLong_FromLong(0); + } + else { + if (PyObject_Compare(PyNumber_Add(r->start, + PyNumber_Multiply(len,r->step)), + r->stop) > 0 ) + off = PyLong_FromLong(0); + } + result = PyUnicode_FromFormat("< %R, %R, %R, ..., %R, %R >", + r->start, + PyNumber_Add(r->start,r->step), + PyNumber_Add(r->start,PyNumber_Multiply( + PyLong_FromLong(2), + r->step)), + PyNumber_Add(r->start,PyNumber_Multiply( + PyNumber_Subtract( + PyNumber_Subtract(len,one), + off), + r->step)), + PyNumber_Add(r->start,PyNumber_Multiply( + PyNumber_Subtract(len,off), + r->step)) ); + } + + Py_DECREF(tmp); + Py_DECREF(len); + Py_DECREF(one); + Py_DECREF(two); + Py_DECREF(zero); + Py_DECREF(off); + + return result; +} + +static PyObject * range_repr(rangeobject *r) { Py_ssize_t istep; @@ -288,7 +354,7 @@ 0, /* tp_as_mapping */ 0, /* tp_hash */ 0, /* tp_call */ - 0, /* tp_str */ + range_str, /* tp_str */ PyObject_GenericGetAttr, /* tp_getattro */ 0, /* tp_setattro */ 0, /* tp_as_buffer */