Index: Objects/typeobject.c =================================================================== --- Objects/typeobject.c (revision 69444) +++ Objects/typeobject.c (working copy) @@ -4618,7 +4618,7 @@ if (res == NULL) return -1; - len = PyLong_AsSsize_t(res); + len = PyNumber_AsSsize_t(res, PyExc_OverflowError); Py_DECREF(res); if (len < 0) { if (!PyErr_Occurred()) Index: Lib/test/test_builtin.py =================================================================== --- Lib/test/test_builtin.py (revision 69444) +++ Lib/test/test_builtin.py (working copy) @@ -611,6 +611,18 @@ def __len__(self): raise ValueError self.assertRaises(ValueError, len, BadSeq()) + class InvalidLen: + def __len__(self): + return None + self.assertRaises(TypeError, len, InvalidLen()) + class FloatLen: + def __len__(self): + return 4.5 + self.assertRaises(TypeError, len, FloatLen()) + class HugeLen: + def __len__(self): + return sys.maxsize + 1 + self.assertRaises(OverflowError, len, HugeLen()) def test_map(self): self.assertEqual(