Index: Objects/rangeobject.c =================================================================== --- Objects/rangeobject.c (revision 62262) +++ Objects/rangeobject.c (working copy) @@ -252,6 +252,43 @@ r->start, r->stop, r->step); } +static PyObject * +range_richcompare(rangeobject *v, rangeobject *w, int op) +{ + int start_same, stop_same, step_same, is_equal; + + if (!PyRange_Check(v) + || !PyRange_Check(w) + || (op != Py_EQ + && op != Py_NE)) { + Py_INCREF(Py_NotImplemented); + return Py_NotImplemented; + } + + start_same = PyObject_RichCompareBool(v->start, w->start, Py_EQ); + if (start_same == -1) + return NULL; + stop_same = PyObject_RichCompareBool(v->stop, w->stop, Py_EQ); + if (stop_same == -1) + return NULL; + step_same = PyObject_RichCompareBool(v->step, w->step, Py_EQ); + if (step_same == -1) + return NULL; + + is_equal = ( + start_same + && stop_same + && step_same + ); + if ((is_equal && op == Py_EQ) + || (!is_equal && op == Py_NE)) { + Py_RETURN_TRUE; + } + else { + Py_RETURN_FALSE; + } +} + static PySequenceMethods range_as_sequence = { (lenfunc)range_length, /* sq_length */ 0, /* sq_concat */ @@ -296,7 +333,7 @@ range_doc, /* tp_doc */ 0, /* tp_traverse */ 0, /* tp_clear */ - 0, /* tp_richcompare */ + (richcmpfunc)range_richcompare, /* tp_richcompare */ 0, /* tp_weaklistoffset */ range_iter, /* tp_iter */ 0, /* tp_iternext */ Index: Lib/test/test_builtin.py =================================================================== --- Lib/test/test_builtin.py (revision 62262) +++ Lib/test/test_builtin.py (working copy) @@ -1594,6 +1594,10 @@ #NEAL self.assertRaises(OverflowError, range, 0, 2*sys.maxsize) self.assertRaises(OverflowError, len, range(0, sys.maxsize**10)) + + self.assertEquals(range(1234), range(1234)) + self.assertEquals(range(4, 3, 2), range(4, 3, 2)) + self.assertNotEquals(range(1, 15, 3), range(1, 20, 3)) def test_input(self): self.write_testfile()