Index: Objects/rangeobject.c =================================================================== --- Objects/rangeobject.c (revision 51299) +++ Objects/rangeobject.c (working copy) @@ -4,17 +4,17 @@ typedef struct { PyObject_HEAD - long start; - long step; - long len; + Py_ssize_t start; + Py_ssize_t step; + Py_ssize_t len; } rangeobject; /* Return number of items in range/xrange (lo, hi, step). step > 0 * required. Return a value < 0 if & only if the true value is too - * large to fit in a signed long. + * large to fit in a Py_ssize_t. */ -static long -get_len_of_range(long lo, long hi, long step) +static Py_ssize_t +get_len_of_range(Py_ssize_t lo, Py_ssize_t hi, Py_ssize_t step) { /* ------------------------------------------------------------- If lo >= hi, the range is empty. @@ -28,12 +28,12 @@ hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough precision to compute the RHS exactly. ---------------------------------------------------------------*/ - long n = 0; + Py_ssize_t n = 0; if (lo < hi) { - unsigned long uhi = (unsigned long)hi; - unsigned long ulo = (unsigned long)lo; - unsigned long diff = uhi - ulo - 1; - n = (long)(diff / (unsigned long)step + 1); + size_t uhi = (size_t)hi; + size_t ulo = (size_t)lo; + size_t diff = uhi - ulo - 1; + n = diff / (size_t)step + 1; } return n; } @@ -42,21 +42,21 @@ range_new(PyTypeObject *type, PyObject *args, PyObject *kw) { rangeobject *obj; - long ilow = 0, ihigh = 0, istep = 1; - long n; + Py_ssize_t ilow = 0, ihigh = 0, istep = 1; + Py_ssize_t n; if (!_PyArg_NoKeywords("xrange()", kw)) return NULL; if (PyTuple_Size(args) <= 1) { if (!PyArg_ParseTuple(args, - "l;xrange() requires 1-3 int arguments", + "n;xrange() requires 1-3 int arguments", &ihigh)) return NULL; } else { if (!PyArg_ParseTuple(args, - "ll|l;xrange() requires 1-3 int arguments", + "nn|n;xrange() requires 1-3 int arguments", &ilow, &ihigh, &istep)) return NULL; } @@ -104,7 +104,7 @@ static Py_ssize_t range_length(rangeobject *r) { - return (Py_ssize_t)(r->len); + return r->len; } static PyObject * @@ -113,16 +113,16 @@ PyObject *rtn; if (r->start == 0 && r->step == 1) - rtn = PyString_FromFormat("xrange(%ld)", + rtn = PyString_FromFormat("xrange(%zd)", r->start + r->len * r->step); else if (r->step == 1) - rtn = PyString_FromFormat("xrange(%ld, %ld)", + rtn = PyString_FromFormat("xrange(%zd, %zd)", r->start, r->start + r->len * r->step); else - rtn = PyString_FromFormat("xrange(%ld, %ld, %ld)", + rtn = PyString_FromFormat("xrange(%zd, %zd, %zd)", r->start, r->start + r->len * r->step, r->step); @@ -194,24 +194,24 @@ typedef struct { PyObject_HEAD - long index; - long start; - long step; - long len; + Py_ssize_t index; + Py_ssize_t start; + Py_ssize_t step; + Py_ssize_t len; } rangeiterobject; static PyObject * rangeiter_next(rangeiterobject *r) { if (r->index < r->len) - return PyInt_FromLong(r->start + (r->index++) * r->step); + return PyInt_FromSsize_t(r->start + (r->index++) * r->step); return NULL; } static PyObject * rangeiter_len(rangeiterobject *r) { - return PyInt_FromLong(r->len - r->index); + return PyInt_FromSsize_t(r->len - r->index); } PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it))."); @@ -278,7 +278,7 @@ range_reverse(PyObject *seq) { rangeiterobject *it; - long start, step, len; + Py_ssize_t start, step, len; if (!PyRange_Check(seq)) { PyErr_BadInternalCall();