Index: Objects/floatobject.c =================================================================== --- Objects/floatobject.c (revision 66269) +++ Objects/floatobject.c (working copy) @@ -1105,6 +1105,13 @@ } static PyObject * +float_long(PyObject *v) +{ + double x = PyFloat_AsDouble(v); + return PyLong_FromDouble(x); +} + +static PyObject * float_float(PyObject *v) { if (PyFloat_CheckExact(v)) @@ -1897,7 +1904,7 @@ 0, /*nb_or*/ float_coerce, /*nb_coerce*/ float_trunc, /*nb_int*/ - float_trunc, /*nb_long*/ + float_long, /*nb_long*/ float_float, /*nb_float*/ 0, /* nb_oct */ 0, /* nb_hex */ Index: Lib/test/test_long.py =================================================================== --- Lib/test/test_long.py (revision 66269) +++ Lib/test/test_long.py (working copy) @@ -279,6 +279,10 @@ self.assertEqual(long(314), 314L) self.assertEqual(long(3.14), 3L) self.assertEqual(long(314L), 314L) + # Check that long() of basic types actually returns a long + self.assertEqual(type(long(314)), long) + self.assertEqual(type(long(3.14)), long) + self.assertEqual(type(long(314L)), long) # Check that conversion from float truncates towards zero self.assertEqual(long(-3.14), -3L) self.assertEqual(long(3.9), 3L)