Home | History | Annotate | Download | only in Objects
      1 /* Range object implementation */
      2 
      3 #include "Python.h"
      4 #include "structmember.h"
      5 
      6 /* Support objects whose length is > PY_SSIZE_T_MAX.
      7 
      8    This could be sped up for small PyLongs if they fit in a Py_ssize_t.
      9    This only matters on Win64.  Though we could use long long which
     10    would presumably help perf.
     11 */
     12 
     13 typedef struct {
     14     PyObject_HEAD
     15     PyObject *start;
     16     PyObject *stop;
     17     PyObject *step;
     18     PyObject *length;
     19 } rangeobject;
     20 
     21 /* Helper function for validating step.  Always returns a new reference or
     22    NULL on error.
     23 */
     24 static PyObject *
     25 validate_step(PyObject *step)
     26 {
     27     /* No step specified, use a step of 1. */
     28     if (!step)
     29         return PyLong_FromLong(1);
     30 
     31     step = PyNumber_Index(step);
     32     if (step && _PyLong_Sign(step) == 0) {
     33         PyErr_SetString(PyExc_ValueError,
     34                         "range() arg 3 must not be zero");
     35         Py_CLEAR(step);
     36     }
     37 
     38     return step;
     39 }
     40 
     41 static PyObject *
     42 compute_range_length(PyObject *start, PyObject *stop, PyObject *step);
     43 
     44 static rangeobject *
     45 make_range_object(PyTypeObject *type, PyObject *start,
     46                   PyObject *stop, PyObject *step)
     47 {
     48     rangeobject *obj = NULL;
     49     PyObject *length;
     50     length = compute_range_length(start, stop, step);
     51     if (length == NULL) {
     52         return NULL;
     53     }
     54     obj = PyObject_New(rangeobject, type);
     55     if (obj == NULL) {
     56         Py_DECREF(length);
     57         return NULL;
     58     }
     59     obj->start = start;
     60     obj->stop = stop;
     61     obj->step = step;
     62     obj->length = length;
     63     return obj;
     64 }
     65 
     66 /* XXX(nnorwitz): should we error check if the user passes any empty ranges?
     67    range(-10)
     68    range(0, -5)
     69    range(0, 5, -1)
     70 */
     71 static PyObject *
     72 range_new(PyTypeObject *type, PyObject *args, PyObject *kw)
     73 {
     74     rangeobject *obj;
     75     PyObject *start = NULL, *stop = NULL, *step = NULL;
     76 
     77     if (!_PyArg_NoKeywords("range()", kw))
     78         return NULL;
     79 
     80     if (PyTuple_Size(args) <= 1) {
     81         if (!PyArg_UnpackTuple(args, "range", 1, 1, &stop))
     82             return NULL;
     83         stop = PyNumber_Index(stop);
     84         if (!stop)
     85             return NULL;
     86         start = PyLong_FromLong(0);
     87         if (!start) {
     88             Py_DECREF(stop);
     89             return NULL;
     90         }
     91         step = PyLong_FromLong(1);
     92         if (!step) {
     93             Py_DECREF(stop);
     94             Py_DECREF(start);
     95             return NULL;
     96         }
     97     }
     98     else {
     99         if (!PyArg_UnpackTuple(args, "range", 2, 3,
    100                                &start, &stop, &step))
    101             return NULL;
    102 
    103         /* Convert borrowed refs to owned refs */
    104         start = PyNumber_Index(start);
    105         if (!start)
    106             return NULL;
    107         stop = PyNumber_Index(stop);
    108         if (!stop) {
    109             Py_DECREF(start);
    110             return NULL;
    111         }
    112         step = validate_step(step);    /* Caution, this can clear exceptions */
    113         if (!step) {
    114             Py_DECREF(start);
    115             Py_DECREF(stop);
    116             return NULL;
    117         }
    118     }
    119 
    120     obj = make_range_object(type, start, stop, step);
    121     if (obj != NULL)
    122         return (PyObject *) obj;
    123 
    124     /* Failed to create object, release attributes */
    125     Py_DECREF(start);
    126     Py_DECREF(stop);
    127     Py_DECREF(step);
    128     return NULL;
    129 }
    130 
    131 PyDoc_STRVAR(range_doc,
    132 "range(stop) -> range object\n\
    133 range(start, stop[, step]) -> range object\n\
    134 \n\
    135 Return an object that produces a sequence of integers from start (inclusive)\n\
    136 to stop (exclusive) by step.  range(i, j) produces i, i+1, i+2, ..., j-1.\n\
    137 start defaults to 0, and stop is omitted!  range(4) produces 0, 1, 2, 3.\n\
    138 These are exactly the valid indices for a list of 4 elements.\n\
    139 When step is given, it specifies the increment (or decrement).");
    140 
    141 static void
    142 range_dealloc(rangeobject *r)
    143 {
    144     Py_DECREF(r->start);
    145     Py_DECREF(r->stop);
    146     Py_DECREF(r->step);
    147     Py_DECREF(r->length);
    148     PyObject_Del(r);
    149 }
    150 
    151 /* Return number of items in range (lo, hi, step) as a PyLong object,
    152  * when arguments are PyLong objects.  Arguments MUST return 1 with
    153  * PyLong_Check().  Return NULL when there is an error.
    154  */
    155 static PyObject*
    156 compute_range_length(PyObject *start, PyObject *stop, PyObject *step)
    157 {
    158     /* -------------------------------------------------------------
    159     Algorithm is equal to that of get_len_of_range(), but it operates
    160     on PyObjects (which are assumed to be PyLong objects).
    161     ---------------------------------------------------------------*/
    162     int cmp_result;
    163     PyObject *lo, *hi;
    164     PyObject *diff = NULL;
    165     PyObject *one = NULL;
    166     PyObject *tmp1 = NULL, *tmp2 = NULL, *result;
    167                 /* holds sub-expression evaluations */
    168 
    169     PyObject *zero = PyLong_FromLong(0);
    170     if (zero == NULL)
    171         return NULL;
    172     cmp_result = PyObject_RichCompareBool(step, zero, Py_GT);
    173     Py_DECREF(zero);
    174     if (cmp_result == -1)
    175         return NULL;
    176 
    177     if (cmp_result == 1) {
    178         lo = start;
    179         hi = stop;
    180         Py_INCREF(step);
    181     } else {
    182         lo = stop;
    183         hi = start;
    184         step = PyNumber_Negative(step);
    185         if (!step)
    186             return NULL;
    187     }
    188 
    189     /* if (lo >= hi), return length of 0. */
    190     cmp_result = PyObject_RichCompareBool(lo, hi, Py_GE);
    191     if (cmp_result != 0) {
    192         Py_DECREF(step);
    193         if (cmp_result < 0)
    194             return NULL;
    195         return PyLong_FromLong(0);
    196     }
    197 
    198     if ((one = PyLong_FromLong(1L)) == NULL)
    199         goto Fail;
    200 
    201     if ((tmp1 = PyNumber_Subtract(hi, lo)) == NULL)
    202         goto Fail;
    203 
    204     if ((diff = PyNumber_Subtract(tmp1, one)) == NULL)
    205         goto Fail;
    206 
    207     if ((tmp2 = PyNumber_FloorDivide(diff, step)) == NULL)
    208         goto Fail;
    209 
    210     if ((result = PyNumber_Add(tmp2, one)) == NULL)
    211         goto Fail;
    212 
    213     Py_DECREF(tmp2);
    214     Py_DECREF(diff);
    215     Py_DECREF(step);
    216     Py_DECREF(tmp1);
    217     Py_DECREF(one);
    218     return result;
    219 
    220   Fail:
    221     Py_DECREF(step);
    222     Py_XDECREF(tmp2);
    223     Py_XDECREF(diff);
    224     Py_XDECREF(tmp1);
    225     Py_XDECREF(one);
    226     return NULL;
    227 }
    228 
    229 static Py_ssize_t
    230 range_length(rangeobject *r)
    231 {
    232     return PyLong_AsSsize_t(r->length);
    233 }
    234 
    235 static PyObject *
    236 compute_item(rangeobject *r, PyObject *i)
    237 {
    238     PyObject *incr, *result;
    239     /* PyLong equivalent to:
    240      *    return r->start + (i * r->step)
    241      */
    242     incr = PyNumber_Multiply(i, r->step);
    243     if (!incr)
    244         return NULL;
    245     result = PyNumber_Add(r->start, incr);
    246     Py_DECREF(incr);
    247     return result;
    248 }
    249 
    250 static PyObject *
    251 compute_range_item(rangeobject *r, PyObject *arg)
    252 {
    253     int cmp_result;
    254     PyObject *i, *result;
    255 
    256     PyObject *zero = PyLong_FromLong(0);
    257     if (zero == NULL)
    258         return NULL;
    259 
    260     /* PyLong equivalent to:
    261      *   if (arg < 0) {
    262      *     i = r->length + arg
    263      *   } else {
    264      *     i = arg
    265      *   }
    266      */
    267     cmp_result = PyObject_RichCompareBool(arg, zero, Py_LT);
    268     if (cmp_result == -1) {
    269         Py_DECREF(zero);
    270         return NULL;
    271     }
    272     if (cmp_result == 1) {
    273       i = PyNumber_Add(r->length, arg);
    274       if (!i) {
    275         Py_DECREF(zero);
    276         return NULL;
    277       }
    278     } else {
    279       i = arg;
    280       Py_INCREF(i);
    281     }
    282 
    283     /* PyLong equivalent to:
    284      *   if (i < 0 || i >= r->length) {
    285      *     <report index out of bounds>
    286      *   }
    287      */
    288     cmp_result = PyObject_RichCompareBool(i, zero, Py_LT);
    289     Py_DECREF(zero);
    290     if (cmp_result == 0) {
    291         cmp_result = PyObject_RichCompareBool(i, r->length, Py_GE);
    292     }
    293     if (cmp_result == -1) {
    294        Py_DECREF(i);
    295        return NULL;
    296     }
    297     if (cmp_result == 1) {
    298         Py_DECREF(i);
    299         PyErr_SetString(PyExc_IndexError,
    300                         "range object index out of range");
    301         return NULL;
    302     }
    303 
    304     result = compute_item(r, i);
    305     Py_DECREF(i);
    306     return result;
    307 }
    308 
    309 static PyObject *
    310 range_item(rangeobject *r, Py_ssize_t i)
    311 {
    312     PyObject *res, *arg = PyLong_FromSsize_t(i);
    313     if (!arg) {
    314         return NULL;
    315     }
    316     res = compute_range_item(r, arg);
    317     Py_DECREF(arg);
    318     return res;
    319 }
    320 
    321 static PyObject *
    322 compute_slice(rangeobject *r, PyObject *_slice)
    323 {
    324     PySliceObject *slice = (PySliceObject *) _slice;
    325     rangeobject *result;
    326     PyObject *start = NULL, *stop = NULL, *step = NULL;
    327     PyObject *substart = NULL, *substop = NULL, *substep = NULL;
    328     int error;
    329 
    330     error = _PySlice_GetLongIndices(slice, r->length, &start, &stop, &step);
    331     if (error == -1)
    332         return NULL;
    333 
    334     substep = PyNumber_Multiply(r->step, step);
    335     if (substep == NULL) goto fail;
    336     Py_CLEAR(step);
    337 
    338     substart = compute_item(r, start);
    339     if (substart == NULL) goto fail;
    340     Py_CLEAR(start);
    341 
    342     substop = compute_item(r, stop);
    343     if (substop == NULL) goto fail;
    344     Py_CLEAR(stop);
    345 
    346     result = make_range_object(Py_TYPE(r), substart, substop, substep);
    347     if (result != NULL) {
    348         return (PyObject *) result;
    349     }
    350 fail:
    351     Py_XDECREF(start);
    352     Py_XDECREF(stop);
    353     Py_XDECREF(step);
    354     Py_XDECREF(substart);
    355     Py_XDECREF(substop);
    356     Py_XDECREF(substep);
    357     return NULL;
    358 }
    359 
    360 /* Assumes (PyLong_CheckExact(ob) || PyBool_Check(ob)) */
    361 static int
    362 range_contains_long(rangeobject *r, PyObject *ob)
    363 {
    364     int cmp1, cmp2, cmp3;
    365     PyObject *tmp1 = NULL;
    366     PyObject *tmp2 = NULL;
    367     PyObject *zero = NULL;
    368     int result = -1;
    369 
    370     zero = PyLong_FromLong(0);
    371     if (zero == NULL) /* MemoryError in int(0) */
    372         goto end;
    373 
    374     /* Check if the value can possibly be in the range. */
    375 
    376     cmp1 = PyObject_RichCompareBool(r->step, zero, Py_GT);
    377     if (cmp1 == -1)
    378         goto end;
    379     if (cmp1 == 1) { /* positive steps: start <= ob < stop */
    380         cmp2 = PyObject_RichCompareBool(r->start, ob, Py_LE);
    381         cmp3 = PyObject_RichCompareBool(ob, r->stop, Py_LT);
    382     }
    383     else { /* negative steps: stop < ob <= start */
    384         cmp2 = PyObject_RichCompareBool(ob, r->start, Py_LE);
    385         cmp3 = PyObject_RichCompareBool(r->stop, ob, Py_LT);
    386     }
    387 
    388     if (cmp2 == -1 || cmp3 == -1) /* TypeError */
    389         goto end;
    390     if (cmp2 == 0 || cmp3 == 0) { /* ob outside of range */
    391         result = 0;
    392         goto end;
    393     }
    394 
    395     /* Check that the stride does not invalidate ob's membership. */
    396     tmp1 = PyNumber_Subtract(ob, r->start);
    397     if (tmp1 == NULL)
    398         goto end;
    399     tmp2 = PyNumber_Remainder(tmp1, r->step);
    400     if (tmp2 == NULL)
    401         goto end;
    402     /* result = ((int(ob) - start) % step) == 0 */
    403     result = PyObject_RichCompareBool(tmp2, zero, Py_EQ);
    404   end:
    405     Py_XDECREF(tmp1);
    406     Py_XDECREF(tmp2);
    407     Py_XDECREF(zero);
    408     return result;
    409 }
    410 
    411 static int
    412 range_contains(rangeobject *r, PyObject *ob)
    413 {
    414     if (PyLong_CheckExact(ob) || PyBool_Check(ob))
    415         return range_contains_long(r, ob);
    416 
    417     return (int)_PySequence_IterSearch((PyObject*)r, ob,
    418                                        PY_ITERSEARCH_CONTAINS);
    419 }
    420 
    421 /* Compare two range objects.  Return 1 for equal, 0 for not equal
    422    and -1 on error.  The algorithm is roughly the C equivalent of
    423 
    424    if r0 is r1:
    425        return True
    426    if len(r0) != len(r1):
    427        return False
    428    if not len(r0):
    429        return True
    430    if r0.start != r1.start:
    431        return False
    432    if len(r0) == 1:
    433        return True
    434    return r0.step == r1.step
    435 */
    436 static int
    437 range_equals(rangeobject *r0, rangeobject *r1)
    438 {
    439     int cmp_result;
    440     PyObject *one;
    441 
    442     if (r0 == r1)
    443         return 1;
    444     cmp_result = PyObject_RichCompareBool(r0->length, r1->length, Py_EQ);
    445     /* Return False or error to the caller. */
    446     if (cmp_result != 1)
    447         return cmp_result;
    448     cmp_result = PyObject_Not(r0->length);
    449     /* Return True or error to the caller. */
    450     if (cmp_result != 0)
    451         return cmp_result;
    452     cmp_result = PyObject_RichCompareBool(r0->start, r1->start, Py_EQ);
    453     /* Return False or error to the caller. */
    454     if (cmp_result != 1)
    455         return cmp_result;
    456     one = PyLong_FromLong(1);
    457     if (!one)
    458         return -1;
    459     cmp_result = PyObject_RichCompareBool(r0->length, one, Py_EQ);
    460     Py_DECREF(one);
    461     /* Return True or error to the caller. */
    462     if (cmp_result != 0)
    463         return cmp_result;
    464     return PyObject_RichCompareBool(r0->step, r1->step, Py_EQ);
    465 }
    466 
    467 static PyObject *
    468 range_richcompare(PyObject *self, PyObject *other, int op)
    469 {
    470     int result;
    471 
    472     if (!PyRange_Check(other))
    473         Py_RETURN_NOTIMPLEMENTED;
    474     switch (op) {
    475     case Py_NE:
    476     case Py_EQ:
    477         result = range_equals((rangeobject*)self, (rangeobject*)other);
    478         if (result == -1)
    479             return NULL;
    480         if (op == Py_NE)
    481             result = !result;
    482         if (result)
    483             Py_RETURN_TRUE;
    484         else
    485             Py_RETURN_FALSE;
    486     case Py_LE:
    487     case Py_GE:
    488     case Py_LT:
    489     case Py_GT:
    490         Py_RETURN_NOTIMPLEMENTED;
    491     default:
    492         PyErr_BadArgument();
    493         return NULL;
    494     }
    495 }
    496 
    497 /* Hash function for range objects.  Rough C equivalent of
    498 
    499    if not len(r):
    500        return hash((len(r), None, None))
    501    if len(r) == 1:
    502        return hash((len(r), r.start, None))
    503    return hash((len(r), r.start, r.step))
    504 */
    505 static Py_hash_t
    506 range_hash(rangeobject *r)
    507 {
    508     PyObject *t;
    509     Py_hash_t result = -1;
    510     int cmp_result;
    511 
    512     t = PyTuple_New(3);
    513     if (!t)
    514         return -1;
    515     Py_INCREF(r->length);
    516     PyTuple_SET_ITEM(t, 0, r->length);
    517     cmp_result = PyObject_Not(r->length);
    518     if (cmp_result == -1)
    519         goto end;
    520     if (cmp_result == 1) {
    521         Py_INCREF(Py_None);
    522         Py_INCREF(Py_None);
    523         PyTuple_SET_ITEM(t, 1, Py_None);
    524         PyTuple_SET_ITEM(t, 2, Py_None);
    525     }
    526     else {
    527         PyObject *one;
    528         Py_INCREF(r->start);
    529         PyTuple_SET_ITEM(t, 1, r->start);
    530         one = PyLong_FromLong(1);
    531         if (!one)
    532             goto end;
    533         cmp_result = PyObject_RichCompareBool(r->length, one, Py_EQ);
    534         Py_DECREF(one);
    535         if (cmp_result == -1)
    536             goto end;
    537         if (cmp_result == 1) {
    538             Py_INCREF(Py_None);
    539             PyTuple_SET_ITEM(t, 2, Py_None);
    540         }
    541         else {
    542             Py_INCREF(r->step);
    543             PyTuple_SET_ITEM(t, 2, r->step);
    544         }
    545     }
    546     result = PyObject_Hash(t);
    547   end:
    548     Py_DECREF(t);
    549     return result;
    550 }
    551 
    552 static PyObject *
    553 range_count(rangeobject *r, PyObject *ob)
    554 {
    555     if (PyLong_CheckExact(ob) || PyBool_Check(ob)) {
    556         int result = range_contains_long(r, ob);
    557         if (result == -1)
    558             return NULL;
    559         else if (result)
    560             return PyLong_FromLong(1);
    561         else
    562             return PyLong_FromLong(0);
    563     } else {
    564         Py_ssize_t count;
    565         count = _PySequence_IterSearch((PyObject*)r, ob, PY_ITERSEARCH_COUNT);
    566         if (count == -1)
    567             return NULL;
    568         return PyLong_FromSsize_t(count);
    569     }
    570 }
    571 
    572 static PyObject *
    573 range_index(rangeobject *r, PyObject *ob)
    574 {
    575     int contains;
    576 
    577     if (!PyLong_CheckExact(ob) && !PyBool_Check(ob)) {
    578         Py_ssize_t index;
    579         index = _PySequence_IterSearch((PyObject*)r, ob, PY_ITERSEARCH_INDEX);
    580         if (index == -1)
    581             return NULL;
    582         return PyLong_FromSsize_t(index);
    583     }
    584 
    585     contains = range_contains_long(r, ob);
    586     if (contains == -1)
    587         return NULL;
    588 
    589     if (contains) {
    590         PyObject *idx, *tmp = PyNumber_Subtract(ob, r->start);
    591         if (tmp == NULL)
    592             return NULL;
    593         /* idx = (ob - r.start) // r.step */
    594         idx = PyNumber_FloorDivide(tmp, r->step);
    595         Py_DECREF(tmp);
    596         return idx;
    597     }
    598 
    599     /* object is not in the range */
    600     PyErr_Format(PyExc_ValueError, "%R is not in range", ob);
    601     return NULL;
    602 }
    603 
    604 static PySequenceMethods range_as_sequence = {
    605     (lenfunc)range_length,      /* sq_length */
    606     0,                          /* sq_concat */
    607     0,                          /* sq_repeat */
    608     (ssizeargfunc)range_item,   /* sq_item */
    609     0,                          /* sq_slice */
    610     0,                          /* sq_ass_item */
    611     0,                          /* sq_ass_slice */
    612     (objobjproc)range_contains, /* sq_contains */
    613 };
    614 
    615 static PyObject *
    616 range_repr(rangeobject *r)
    617 {
    618     Py_ssize_t istep;
    619 
    620     /* Check for special case values for printing.  We don't always
    621        need the step value.  We don't care about errors
    622        (it means overflow), so clear the errors. */
    623     istep = PyNumber_AsSsize_t(r->step, NULL);
    624     if (istep != 1 || (istep == -1 && PyErr_Occurred())) {
    625         PyErr_Clear();
    626     }
    627 
    628     if (istep == 1)
    629         return PyUnicode_FromFormat("range(%R, %R)", r->start, r->stop);
    630     else
    631         return PyUnicode_FromFormat("range(%R, %R, %R)",
    632                                     r->start, r->stop, r->step);
    633 }
    634 
    635 /* Pickling support */
    636 static PyObject *
    637 range_reduce(rangeobject *r, PyObject *args)
    638 {
    639     return Py_BuildValue("(O(OOO))", Py_TYPE(r),
    640                          r->start, r->stop, r->step);
    641 }
    642 
    643 static PyObject *
    644 range_subscript(rangeobject* self, PyObject* item)
    645 {
    646     if (PyIndex_Check(item)) {
    647         PyObject *i, *result;
    648         i = PyNumber_Index(item);
    649         if (!i)
    650             return NULL;
    651         result = compute_range_item(self, i);
    652         Py_DECREF(i);
    653         return result;
    654     }
    655     if (PySlice_Check(item)) {
    656         return compute_slice(self, item);
    657     }
    658     PyErr_Format(PyExc_TypeError,
    659                  "range indices must be integers or slices, not %.200s",
    660                  item->ob_type->tp_name);
    661     return NULL;
    662 }
    663 
    664 
    665 static PyMappingMethods range_as_mapping = {
    666         (lenfunc)range_length,       /* mp_length */
    667         (binaryfunc)range_subscript, /* mp_subscript */
    668         (objobjargproc)0,            /* mp_ass_subscript */
    669 };
    670 
    671 static PyObject * range_iter(PyObject *seq);
    672 static PyObject * range_reverse(PyObject *seq);
    673 
    674 PyDoc_STRVAR(reverse_doc,
    675 "Return a reverse iterator.");
    676 
    677 PyDoc_STRVAR(count_doc,
    678 "rangeobject.count(value) -> integer -- return number of occurrences of value");
    679 
    680 PyDoc_STRVAR(index_doc,
    681 "rangeobject.index(value, [start, [stop]]) -> integer -- return index of value.\n"
    682 "Raise ValueError if the value is not present.");
    683 
    684 static PyMethodDef range_methods[] = {
    685     {"__reversed__",    (PyCFunction)range_reverse, METH_NOARGS, reverse_doc},
    686     {"__reduce__",      (PyCFunction)range_reduce,  METH_VARARGS},
    687     {"count",           (PyCFunction)range_count,   METH_O,      count_doc},
    688     {"index",           (PyCFunction)range_index,   METH_O,      index_doc},
    689     {NULL,              NULL}           /* sentinel */
    690 };
    691 
    692 static PyMemberDef range_members[] = {
    693     {"start",   T_OBJECT_EX,    offsetof(rangeobject, start),   READONLY},
    694     {"stop",    T_OBJECT_EX,    offsetof(rangeobject, stop),    READONLY},
    695     {"step",    T_OBJECT_EX,    offsetof(rangeobject, step),    READONLY},
    696     {0}
    697 };
    698 
    699 PyTypeObject PyRange_Type = {
    700         PyVarObject_HEAD_INIT(&PyType_Type, 0)
    701         "range",                /* Name of this type */
    702         sizeof(rangeobject),    /* Basic object size */
    703         0,                      /* Item size for varobject */
    704         (destructor)range_dealloc, /* tp_dealloc */
    705         0,                      /* tp_print */
    706         0,                      /* tp_getattr */
    707         0,                      /* tp_setattr */
    708         0,                      /* tp_reserved */
    709         (reprfunc)range_repr,   /* tp_repr */
    710         0,                      /* tp_as_number */
    711         &range_as_sequence,     /* tp_as_sequence */
    712         &range_as_mapping,      /* tp_as_mapping */
    713         (hashfunc)range_hash,   /* tp_hash */
    714         0,                      /* tp_call */
    715         0,                      /* tp_str */
    716         PyObject_GenericGetAttr,  /* tp_getattro */
    717         0,                      /* tp_setattro */
    718         0,                      /* tp_as_buffer */
    719         Py_TPFLAGS_DEFAULT,     /* tp_flags */
    720         range_doc,              /* tp_doc */
    721         0,                      /* tp_traverse */
    722         0,                      /* tp_clear */
    723         range_richcompare,      /* tp_richcompare */
    724         0,                      /* tp_weaklistoffset */
    725         range_iter,             /* tp_iter */
    726         0,                      /* tp_iternext */
    727         range_methods,          /* tp_methods */
    728         range_members,          /* tp_members */
    729         0,                      /* tp_getset */
    730         0,                      /* tp_base */
    731         0,                      /* tp_dict */
    732         0,                      /* tp_descr_get */
    733         0,                      /* tp_descr_set */
    734         0,                      /* tp_dictoffset */
    735         0,                      /* tp_init */
    736         0,                      /* tp_alloc */
    737         range_new,              /* tp_new */
    738 };
    739 
    740 /*********************** range Iterator **************************/
    741 
    742 /* There are 2 types of iterators, one for C longs, the other for
    743    Python ints (ie, PyObjects).  This should make iteration fast
    744    in the normal case, but possible for any numeric value.
    745 */
    746 
    747 typedef struct {
    748         PyObject_HEAD
    749         long    index;
    750         long    start;
    751         long    step;
    752         long    len;
    753 } rangeiterobject;
    754 
    755 static PyObject *
    756 rangeiter_next(rangeiterobject *r)
    757 {
    758     if (r->index < r->len)
    759         /* cast to unsigned to avoid possible signed overflow
    760            in intermediate calculations. */
    761         return PyLong_FromLong((long)(r->start +
    762                                       (unsigned long)(r->index++) * r->step));
    763     return NULL;
    764 }
    765 
    766 static PyObject *
    767 rangeiter_len(rangeiterobject *r)
    768 {
    769     return PyLong_FromLong(r->len - r->index);
    770 }
    771 
    772 PyDoc_STRVAR(length_hint_doc,
    773              "Private method returning an estimate of len(list(it)).");
    774 
    775 static PyObject *
    776 rangeiter_reduce(rangeiterobject *r)
    777 {
    778     PyObject *start=NULL, *stop=NULL, *step=NULL;
    779     PyObject *range;
    780 
    781     /* create a range object for pickling */
    782     start = PyLong_FromLong(r->start);
    783     if (start == NULL)
    784         goto err;
    785     stop = PyLong_FromLong(r->start + r->len * r->step);
    786     if (stop == NULL)
    787         goto err;
    788     step = PyLong_FromLong(r->step);
    789     if (step == NULL)
    790         goto err;
    791     range = (PyObject*)make_range_object(&PyRange_Type,
    792                                start, stop, step);
    793     if (range == NULL)
    794         goto err;
    795     /* return the result */
    796     return Py_BuildValue("N(N)i", _PyObject_GetBuiltin("iter"), range, r->index);
    797 err:
    798     Py_XDECREF(start);
    799     Py_XDECREF(stop);
    800     Py_XDECREF(step);
    801     return NULL;
    802 }
    803 
    804 static PyObject *
    805 rangeiter_setstate(rangeiterobject *r, PyObject *state)
    806 {
    807     long index = PyLong_AsLong(state);
    808     if (index == -1 && PyErr_Occurred())
    809         return NULL;
    810     /* silently clip the index value */
    811     if (index < 0)
    812         index = 0;
    813     else if (index > r->len)
    814         index = r->len; /* exhausted iterator */
    815     r->index = index;
    816     Py_RETURN_NONE;
    817 }
    818 
    819 PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");
    820 PyDoc_STRVAR(setstate_doc, "Set state information for unpickling.");
    821 
    822 static PyMethodDef rangeiter_methods[] = {
    823     {"__length_hint__", (PyCFunction)rangeiter_len, METH_NOARGS,
    824         length_hint_doc},
    825     {"__reduce__", (PyCFunction)rangeiter_reduce, METH_NOARGS,
    826         reduce_doc},
    827     {"__setstate__", (PyCFunction)rangeiter_setstate, METH_O,
    828         setstate_doc},
    829     {NULL,              NULL}           /* sentinel */
    830 };
    831 
    832 static PyObject *rangeiter_new(PyTypeObject *, PyObject *args, PyObject *kw);
    833 
    834 PyTypeObject PyRangeIter_Type = {
    835         PyVarObject_HEAD_INIT(&PyType_Type, 0)
    836         "range_iterator",                        /* tp_name */
    837         sizeof(rangeiterobject),                /* tp_basicsize */
    838         0,                                      /* tp_itemsize */
    839         /* methods */
    840         (destructor)PyObject_Del,               /* tp_dealloc */
    841         0,                                      /* tp_print */
    842         0,                                      /* tp_getattr */
    843         0,                                      /* tp_setattr */
    844         0,                                      /* tp_reserved */
    845         0,                                      /* tp_repr */
    846         0,                                      /* tp_as_number */
    847         0,                                      /* tp_as_sequence */
    848         0,                                      /* tp_as_mapping */
    849         0,                                      /* tp_hash */
    850         0,                                      /* tp_call */
    851         0,                                      /* tp_str */
    852         PyObject_GenericGetAttr,                /* tp_getattro */
    853         0,                                      /* tp_setattro */
    854         0,                                      /* tp_as_buffer */
    855         Py_TPFLAGS_DEFAULT,                     /* tp_flags */
    856         0,                                      /* tp_doc */
    857         0,                                      /* tp_traverse */
    858         0,                                      /* tp_clear */
    859         0,                                      /* tp_richcompare */
    860         0,                                      /* tp_weaklistoffset */
    861         PyObject_SelfIter,                      /* tp_iter */
    862         (iternextfunc)rangeiter_next,           /* tp_iternext */
    863         rangeiter_methods,                      /* tp_methods */
    864         0,                                      /* tp_members */
    865         0,                                      /* tp_getset */
    866         0,                                      /* tp_base */
    867         0,                                      /* tp_dict */
    868         0,                                      /* tp_descr_get */
    869         0,                                      /* tp_descr_set */
    870         0,                                      /* tp_dictoffset */
    871         0,                                      /* tp_init */
    872         0,                                      /* tp_alloc */
    873         rangeiter_new,                          /* tp_new */
    874 };
    875 
    876 /* Return number of items in range (lo, hi, step).  step != 0
    877  * required.  The result always fits in an unsigned long.
    878  */
    879 static unsigned long
    880 get_len_of_range(long lo, long hi, long step)
    881 {
    882     /* -------------------------------------------------------------
    883     If step > 0 and lo >= hi, or step < 0 and lo <= hi, the range is empty.
    884     Else for step > 0, if n values are in the range, the last one is
    885     lo + (n-1)*step, which must be <= hi-1.  Rearranging,
    886     n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
    887     the proper value.  Since lo < hi in this case, hi-lo-1 >= 0, so
    888     the RHS is non-negative and so truncation is the same as the
    889     floor.  Letting M be the largest positive long, the worst case
    890     for the RHS numerator is hi=M, lo=-M-1, and then
    891     hi-lo-1 = M-(-M-1)-1 = 2*M.  Therefore unsigned long has enough
    892     precision to compute the RHS exactly.  The analysis for step < 0
    893     is similar.
    894     ---------------------------------------------------------------*/
    895     assert(step != 0);
    896     if (step > 0 && lo < hi)
    897         return 1UL + (hi - 1UL - lo) / step;
    898     else if (step < 0 && lo > hi)
    899         return 1UL + (lo - 1UL - hi) / (0UL - step);
    900     else
    901         return 0UL;
    902 }
    903 
    904 /* Initialize a rangeiter object.  If the length of the rangeiter object
    905    is not representable as a C long, OverflowError is raised. */
    906 
    907 static PyObject *
    908 fast_range_iter(long start, long stop, long step)
    909 {
    910     rangeiterobject *it = PyObject_New(rangeiterobject, &PyRangeIter_Type);
    911     unsigned long ulen;
    912     if (it == NULL)
    913         return NULL;
    914     it->start = start;
    915     it->step = step;
    916     ulen = get_len_of_range(start, stop, step);
    917     if (ulen > (unsigned long)LONG_MAX) {
    918         Py_DECREF(it);
    919         PyErr_SetString(PyExc_OverflowError,
    920                         "range too large to represent as a range_iterator");
    921         return NULL;
    922     }
    923     it->len = (long)ulen;
    924     it->index = 0;
    925     return (PyObject *)it;
    926 }
    927 
    928 static PyObject *
    929 rangeiter_new(PyTypeObject *type, PyObject *args, PyObject *kw)
    930 {
    931     long start, stop, step;
    932 
    933     if (PyErr_WarnEx(PyExc_DeprecationWarning,
    934                      "range_iterator(): creating instances of range_iterator "
    935                      "by calling range_iterator type is deprecated",
    936                      1)) {
    937         return NULL;
    938     }
    939 
    940     if (!_PyArg_NoKeywords("range_iterator()", kw)) {
    941         return NULL;
    942     }
    943 
    944     if (!PyArg_ParseTuple(args,
    945                           "lll;range_iterator() requires 3 int arguments",
    946                           &start, &stop, &step)) {
    947         return NULL;
    948     }
    949     if (step == 0) {
    950         PyErr_SetString(PyExc_ValueError,
    951                         "range_iterator() arg 3 must not be zero");
    952         return NULL;
    953     }
    954 
    955     return fast_range_iter(start, stop, step);
    956 }
    957 
    958 typedef struct {
    959     PyObject_HEAD
    960     PyObject *index;
    961     PyObject *start;
    962     PyObject *step;
    963     PyObject *len;
    964 } longrangeiterobject;
    965 
    966 static PyObject *
    967 longrangeiter_len(longrangeiterobject *r, PyObject *no_args)
    968 {
    969     return PyNumber_Subtract(r->len, r->index);
    970 }
    971 
    972 static PyObject *
    973 longrangeiter_reduce(longrangeiterobject *r)
    974 {
    975     PyObject *product, *stop=NULL;
    976     PyObject *range;
    977 
    978     /* create a range object for pickling.  Must calculate the "stop" value */
    979     product = PyNumber_Multiply(r->len, r->step);
    980     if (product == NULL)
    981         return NULL;
    982     stop = PyNumber_Add(r->start, product);
    983     Py_DECREF(product);
    984     if (stop ==  NULL)
    985         return NULL;
    986     Py_INCREF(r->start);
    987     Py_INCREF(r->step);
    988     range =  (PyObject*)make_range_object(&PyRange_Type,
    989                                r->start, stop, r->step);
    990     if (range == NULL) {
    991         Py_DECREF(r->start);
    992         Py_DECREF(stop);
    993         Py_DECREF(r->step);
    994         return NULL;
    995     }
    996 
    997     /* return the result */
    998     return Py_BuildValue("N(N)O", _PyObject_GetBuiltin("iter"), range, r->index);
    999 }
   1000 
   1001 static PyObject *
   1002 longrangeiter_setstate(longrangeiterobject *r, PyObject *state)
   1003 {
   1004     int cmp;
   1005 
   1006     /* clip the value */
   1007     PyObject *zero = PyLong_FromLong(0);
   1008     if (zero == NULL)
   1009         return NULL;
   1010     cmp = PyObject_RichCompareBool(state, zero, Py_LT);
   1011     if (cmp > 0) {
   1012         Py_XSETREF(r->index, zero);
   1013         Py_RETURN_NONE;
   1014     }
   1015     Py_DECREF(zero);
   1016     if (cmp < 0)
   1017         return NULL;
   1018 
   1019     cmp = PyObject_RichCompareBool(r->len, state, Py_LT);
   1020     if (cmp < 0)
   1021         return NULL;
   1022     if (cmp > 0)
   1023         state = r->len;
   1024 
   1025     Py_INCREF(state);
   1026     Py_XSETREF(r->index, state);
   1027     Py_RETURN_NONE;
   1028 }
   1029 
   1030 static PyMethodDef longrangeiter_methods[] = {
   1031     {"__length_hint__", (PyCFunction)longrangeiter_len, METH_NOARGS,
   1032         length_hint_doc},
   1033     {"__reduce__", (PyCFunction)longrangeiter_reduce, METH_NOARGS,
   1034         reduce_doc},
   1035     {"__setstate__", (PyCFunction)longrangeiter_setstate, METH_O,
   1036         setstate_doc},
   1037     {NULL,              NULL}           /* sentinel */
   1038 };
   1039 
   1040 static void
   1041 longrangeiter_dealloc(longrangeiterobject *r)
   1042 {
   1043     Py_XDECREF(r->index);
   1044     Py_XDECREF(r->start);
   1045     Py_XDECREF(r->step);
   1046     Py_XDECREF(r->len);
   1047     PyObject_Del(r);
   1048 }
   1049 
   1050 static PyObject *
   1051 longrangeiter_next(longrangeiterobject *r)
   1052 {
   1053     PyObject *one, *product, *new_index, *result;
   1054     if (PyObject_RichCompareBool(r->index, r->len, Py_LT) != 1)
   1055         return NULL;
   1056 
   1057     one = PyLong_FromLong(1);
   1058     if (!one)
   1059         return NULL;
   1060 
   1061     new_index = PyNumber_Add(r->index, one);
   1062     Py_DECREF(one);
   1063     if (!new_index)
   1064         return NULL;
   1065 
   1066     product = PyNumber_Multiply(r->index, r->step);
   1067     if (!product) {
   1068         Py_DECREF(new_index);
   1069         return NULL;
   1070     }
   1071 
   1072     result = PyNumber_Add(r->start, product);
   1073     Py_DECREF(product);
   1074     if (result) {
   1075         Py_SETREF(r->index, new_index);
   1076     }
   1077     else {
   1078         Py_DECREF(new_index);
   1079     }
   1080 
   1081     return result;
   1082 }
   1083 
   1084 PyTypeObject PyLongRangeIter_Type = {
   1085         PyVarObject_HEAD_INIT(&PyType_Type, 0)
   1086         "longrange_iterator",                   /* tp_name */
   1087         sizeof(longrangeiterobject),            /* tp_basicsize */
   1088         0,                                      /* tp_itemsize */
   1089         /* methods */
   1090         (destructor)longrangeiter_dealloc,      /* tp_dealloc */
   1091         0,                                      /* tp_print */
   1092         0,                                      /* tp_getattr */
   1093         0,                                      /* tp_setattr */
   1094         0,                                      /* tp_reserved */
   1095         0,                                      /* tp_repr */
   1096         0,                                      /* tp_as_number */
   1097         0,                                      /* tp_as_sequence */
   1098         0,                                      /* tp_as_mapping */
   1099         0,                                      /* tp_hash */
   1100         0,                                      /* tp_call */
   1101         0,                                      /* tp_str */
   1102         PyObject_GenericGetAttr,                /* tp_getattro */
   1103         0,                                      /* tp_setattro */
   1104         0,                                      /* tp_as_buffer */
   1105         Py_TPFLAGS_DEFAULT,                     /* tp_flags */
   1106         0,                                      /* tp_doc */
   1107         0,                                      /* tp_traverse */
   1108         0,                                      /* tp_clear */
   1109         0,                                      /* tp_richcompare */
   1110         0,                                      /* tp_weaklistoffset */
   1111         PyObject_SelfIter,                      /* tp_iter */
   1112         (iternextfunc)longrangeiter_next,       /* tp_iternext */
   1113         longrangeiter_methods,                  /* tp_methods */
   1114         0,
   1115 };
   1116 
   1117 static PyObject *
   1118 range_iter(PyObject *seq)
   1119 {
   1120     rangeobject *r = (rangeobject *)seq;
   1121     longrangeiterobject *it;
   1122     long lstart, lstop, lstep;
   1123     PyObject *int_it;
   1124 
   1125     assert(PyRange_Check(seq));
   1126 
   1127     /* If all three fields and the length convert to long, use the int
   1128      * version */
   1129     lstart = PyLong_AsLong(r->start);
   1130     if (lstart == -1 && PyErr_Occurred()) {
   1131         PyErr_Clear();
   1132         goto long_range;
   1133     }
   1134     lstop = PyLong_AsLong(r->stop);
   1135     if (lstop == -1 && PyErr_Occurred()) {
   1136         PyErr_Clear();
   1137         goto long_range;
   1138     }
   1139     lstep = PyLong_AsLong(r->step);
   1140     if (lstep == -1 && PyErr_Occurred()) {
   1141         PyErr_Clear();
   1142         goto long_range;
   1143     }
   1144     int_it = fast_range_iter(lstart, lstop, lstep);
   1145     if (int_it == NULL && PyErr_ExceptionMatches(PyExc_OverflowError)) {
   1146         PyErr_Clear();
   1147         goto long_range;
   1148     }
   1149     return (PyObject *)int_it;
   1150 
   1151   long_range:
   1152     it = PyObject_New(longrangeiterobject, &PyLongRangeIter_Type);
   1153     if (it == NULL)
   1154         return NULL;
   1155 
   1156     /* Do all initialization here, so we can DECREF on failure. */
   1157     it->start = r->start;
   1158     it->step = r->step;
   1159     it->len = r->length;
   1160     Py_INCREF(it->start);
   1161     Py_INCREF(it->step);
   1162     Py_INCREF(it->len);
   1163 
   1164     it->index = PyLong_FromLong(0);
   1165     if (!it->index)
   1166         goto create_failure;
   1167 
   1168     return (PyObject *)it;
   1169 
   1170 create_failure:
   1171     Py_DECREF(it);
   1172     return NULL;
   1173 }
   1174 
   1175 static PyObject *
   1176 range_reverse(PyObject *seq)
   1177 {
   1178     rangeobject *range = (rangeobject*) seq;
   1179     longrangeiterobject *it;
   1180     PyObject *one, *sum, *diff, *product;
   1181     long lstart, lstop, lstep, new_start, new_stop;
   1182     unsigned long ulen;
   1183 
   1184     assert(PyRange_Check(seq));
   1185 
   1186     /* reversed(range(start, stop, step)) can be expressed as
   1187        range(start+(n-1)*step, start-step, -step), where n is the number of
   1188        integers in the range.
   1189 
   1190        If each of start, stop, step, -step, start-step, and the length
   1191        of the iterator is representable as a C long, use the int
   1192        version.  This excludes some cases where the reversed range is
   1193        representable as a range_iterator, but it's good enough for
   1194        common cases and it makes the checks simple. */
   1195 
   1196     lstart = PyLong_AsLong(range->start);
   1197     if (lstart == -1 && PyErr_Occurred()) {
   1198         PyErr_Clear();
   1199         goto long_range;
   1200     }
   1201     lstop = PyLong_AsLong(range->stop);
   1202     if (lstop == -1 && PyErr_Occurred()) {
   1203         PyErr_Clear();
   1204         goto long_range;
   1205     }
   1206     lstep = PyLong_AsLong(range->step);
   1207     if (lstep == -1 && PyErr_Occurred()) {
   1208         PyErr_Clear();
   1209         goto long_range;
   1210     }
   1211     /* check for possible overflow of -lstep */
   1212     if (lstep == LONG_MIN)
   1213         goto long_range;
   1214 
   1215     /* check for overflow of lstart - lstep:
   1216 
   1217        for lstep > 0, need only check whether lstart - lstep < LONG_MIN.
   1218        for lstep < 0, need only check whether lstart - lstep > LONG_MAX
   1219 
   1220        Rearrange these inequalities as:
   1221 
   1222            lstart - LONG_MIN < lstep  (lstep > 0)
   1223            LONG_MAX - lstart < -lstep  (lstep < 0)
   1224 
   1225        and compute both sides as unsigned longs, to avoid the
   1226        possibility of undefined behaviour due to signed overflow. */
   1227 
   1228     if (lstep > 0) {
   1229          if ((unsigned long)lstart - LONG_MIN < (unsigned long)lstep)
   1230             goto long_range;
   1231     }
   1232     else {
   1233         if (LONG_MAX - (unsigned long)lstart < 0UL - lstep)
   1234             goto long_range;
   1235     }
   1236 
   1237     ulen = get_len_of_range(lstart, lstop, lstep);
   1238     if (ulen > (unsigned long)LONG_MAX)
   1239         goto long_range;
   1240 
   1241     new_stop = lstart - lstep;
   1242     new_start = (long)(new_stop + ulen * lstep);
   1243     return fast_range_iter(new_start, new_stop, -lstep);
   1244 
   1245 long_range:
   1246     it = PyObject_New(longrangeiterobject, &PyLongRangeIter_Type);
   1247     if (it == NULL)
   1248         return NULL;
   1249 
   1250     /* start + (len - 1) * step */
   1251     it->len = range->length;
   1252     Py_INCREF(it->len);
   1253 
   1254     one = PyLong_FromLong(1);
   1255     if (!one)
   1256         goto create_failure;
   1257 
   1258     diff = PyNumber_Subtract(it->len, one);
   1259     Py_DECREF(one);
   1260     if (!diff)
   1261         goto create_failure;
   1262 
   1263     product = PyNumber_Multiply(diff, range->step);
   1264     Py_DECREF(diff);
   1265     if (!product)
   1266         goto create_failure;
   1267 
   1268     sum = PyNumber_Add(range->start, product);
   1269     Py_DECREF(product);
   1270     it->start = sum;
   1271     if (!it->start)
   1272         goto create_failure;
   1273 
   1274     it->step = PyNumber_Negative(range->step);
   1275     if (!it->step)
   1276         goto create_failure;
   1277 
   1278     it->index = PyLong_FromLong(0);
   1279     if (!it->index)
   1280         goto create_failure;
   1281 
   1282     return (PyObject *)it;
   1283 
   1284 create_failure:
   1285     Py_DECREF(it);
   1286     return NULL;
   1287 }
   1288