Index: Objects/rangeobject.c =================================================================== RCS file: /cvsroot/python/python/dist/src/Objects/rangeobject.c,v retrieving revision 2.51 diff -a -u -c -r2.51 rangeobject.c *** Objects/rangeobject.c 2 Aug 2004 13:22:01 -0000 2.51 --- Objects/rangeobject.c 4 Aug 2004 05:51:35 -0000 *************** *** 141,146 **** --- 141,180 ---- return (int)(r->len); } + static int + range_contains(rangeobject *r, PyObject *num) + { + long x = PyInt_AsLong(num) - r->start; + + if(PyErr_Occurred()) { + /*not an int.*/ + int retval = 0; + PyObject *xAsInt; + long max = r->start + r->len; + + PyErr_Clear(); + + for(x = r->start; x < max; x += r->step) { + xAsInt = PyInt_FromLong(x); + if(PyObject_Compare(xAsInt, num) == 0) { + retval = 1; + break; + } + Py_DECREF(xAsInt); + } + + return retval; + } + else { + return ((x / r->step) < r->len) && + !(x % r->step) && + ( + (!x) || + ((x < 0) == (r->step < 0)) + ); + } + } + static PyObject * range_repr(rangeobject *r) { *************** *** 169,174 **** --- 203,213 ---- 0, /* sq_repeat */ (intargfunc)range_item, /* sq_item */ 0, /* sq_slice */ + 0, /* sq_ass_item */ + 0, /* sq_ass_slice */ + (objobjproc)range_contains, /* sq_contains */ + 0, /* sq_inplace_concat */ + 0, /* sq_inplace_repeat */ }; static PyObject * range_iter(PyObject *seq); Index: Lib/test/test_xrange.py =================================================================== RCS file: /cvsroot/python/python/dist/src/Lib/test/test_xrange.py,v retrieving revision 1.1 diff -a -u -c -r1.1 test_xrange.py *** Lib/test/test_xrange.py 8 Jul 2004 01:59:55 -0000 1.1 --- Lib/test/test_xrange.py 4 Aug 2004 05:51:35 -0000 *************** *** 52,57 **** --- 52,85 ---- self.assertRaises(OverflowError, xrange, -sys.maxint, sys.maxint) self.assertRaises(OverflowError, xrange, 0, 2*sys.maxint) + x = xrange(0, sys.maxint) + self.assert_(0 in x) + self.assert_(sys.maxint not in x) + self.assert_((sys.maxint - 1) in x) + self.assert_(-1 not in x) + + x = xrange(0, 100, 2) + self.assert_(0 in x) + self.assert_(-1 not in x) + self.assert_(-2 not in x) + self.assert_(1 not in x) + self.assert_(2 in x) + self.assert_(3 not in x) + self.assert_(100 not in x) + self.assert_(99 not in x) + self.assert_(98 in x) + + x = xrange(0, -100, -2) + self.assert_(0 in x) + self.assert_(1 not in x) + self.assert_(2 not in x) + self.assert_(-1 not in x) + self.assert_(-2 in x) + self.assert_(-3 not in x) + self.assert_(-100 not in x) + self.assert_(-99 not in x) + self.assert_(-98 in x) + def test_main(): test.test_support.run_unittest(XrangeTest)