Index: Objects/rangeobject.c =================================================================== --- Objects/rangeobject.c (revision 56752) +++ Objects/rangeobject.c (working copy) @@ -282,12 +282,69 @@ return result; } +static int +range_contains(rangeobject *r, PyObject *ob) { + if (PyNumber_Check(ob)) { + int cmp_call, cmp_result; + PyObject *zero = PyLong_FromLong(0); + + if (zero == NULL) + return 0; + cmp_call = PyObject_Cmp(r->step, zero, &cmp_result); + Py_CLEAR(zero); + if (cmp_call == -1) + return 0; + + int cmp_call1, cmp_result1; + int cmp_call2, cmp_result2; + + assert(cmp_result != 0); + if (cmp_result > 0) { // positive steps + cmp_call1 = PyObject_Cmp(ob, r->start, &cmp_result1); + cmp_call2 = PyObject_Cmp(r->stop, ob, &cmp_result2); + } + else { // negative steps + cmp_call1 = PyObject_Cmp(r->start, ob, &cmp_result1); + cmp_call2 = PyObject_Cmp(ob, r->stop, &cmp_result2); + } + + if (cmp_call1 == -1 || cmp_call2 == -1) + return 0; + + if (cmp_result1 < 0 || cmp_result2 <= 0) + return 0; + + PyObject *tmp1, *tmp2; + int result = 0; + + if ((tmp1 = PyNumber_Subtract(ob, r->start)) == NULL) + return 0; + + if ((tmp2 = PyNumber_Remainder(tmp1, r->step)) == NULL) + return 0; + + zero = PyLong_FromLong(0); + Py_INCREF(zero); + if (PyObject_Cmp(tmp2, zero, &result) == -1) { + Py_DECREF(zero); + return 0; + } + Py_CLEAR(zero); + + return result == 0; + } + return 0; +} + static PySequenceMethods range_as_sequence = { (lenfunc)range_length, /* sq_length */ 0, /* sq_concat */ 0, /* sq_repeat */ (ssizeargfunc)range_item, /* sq_item */ 0, /* sq_slice */ + 0, /* sq_ass_item */ + 0, /* sq_ass_slice */ + (objobjproc)range_contains, /* sq_contains */ }; static PyObject * range_iter(PyObject *seq);