Index: Objects/classobject.c =================================================================== --- Objects/classobject.c (revision 76869) +++ Objects/classobject.c (working copy) @@ -1173,6 +1173,13 @@ func = instance_getattr(inst, getitemstr); if (func == NULL) return NULL; + + /* Solve bug 7532 */ + if (i < 0) + i = 0; + if (j < i) + j = i; + arg = Py_BuildValue("(N)", _PySlice_FromIndices(i, j)); } else { @@ -1262,6 +1269,12 @@ if (func == NULL) return -1; + /* Solve bug 7532 */ + if (i < 0) + i = 0; + if (j < i) + j = i; + arg = Py_BuildValue("(N)", _PySlice_FromIndices(i, j)); } Index: Lib/test/test_index.py =================================================================== --- Lib/test/test_index.py (revision 76869) +++ Lib/test/test_index.py (working copy) @@ -187,6 +187,19 @@ def _getitem_helper(self, base): class GetItem(base): def __len__(self): + return maxint # cannot return long here + def __getitem__(self, key): + return key + x = GetItem() + self.assertEqual(x[self.pos], self.pos) + self.assertEqual(x[self.neg], self.neg) + # Bug #7532 - Classic class behaves like new-style class + self.assertEqual(x[self.neg:self.pos].indices(maxsize), (0, maxsize, 1)) + self.assertEqual(x[self.neg:self.pos:1].indices(maxsize), (0, maxsize, 1)) + + def _getslice_helper_deprecated(self, base): + class GetItem(base): + def __len__(self): return maxint #cannot return long here def __getitem__(self, key): return key @@ -200,10 +213,16 @@ def test_getitem(self): self._getitem_helper(object) + # Silence Py3k warning + with test_support.check_warnings(): + self._getslice_helper_deprecated(object) def test_getitem_classic(self): class Empty: pass self._getitem_helper(Empty) + # Silence Py3k warning + with test_support.check_warnings(): + self._getslice_helper_deprecated(Empty) def test_sequence_repeat(self): self.assertRaises(OverflowError, lambda: "a" * self.pos)