summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeal Norwitz <nnorwitz@gmail.com>2003-01-28 19:21:24 (GMT)
committerNeal Norwitz <nnorwitz@gmail.com>2003-01-28 19:21:24 (GMT)
commitabcb0c03ade3cee52b71362f57b16af3e00c743b (patch)
treea4afc16116d2e0d08a0ea162932cb635b550bde0
parent54fb192508130fa17df5b252c63d125218907035 (diff)
downloadcpython-abcb0c03ade3cee52b71362f57b16af3e00c743b.zip
cpython-abcb0c03ade3cee52b71362f57b16af3e00c743b.tar.gz
cpython-abcb0c03ade3cee52b71362f57b16af3e00c743b.tar.bz2
Fix SF bug# 676155, RuntimeWarning with tp_compare
Check return value of PyLong_AsDouble(), it can return an error.
-rw-r--r--Lib/test/test_builtin.py1
-rw-r--r--Lib/test/test_long.py6
-rw-r--r--Misc/NEWS4
-rw-r--r--Objects/floatobject.c5
4 files changed, 13 insertions, 3 deletions
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index f7e652d..55ea8d2 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -186,6 +186,7 @@ class BuiltinTest(unittest.TestCase):
def __coerce__(self, other):
raise ValueError
self.assertRaises(ValueError, coerce, 42, BadNumber())
+ self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
def test_compile(self):
compile('print 1\n', '', 'exec')
diff --git a/Lib/test/test_long.py b/Lib/test/test_long.py
index 9cab2de..9eb063c 100644
--- a/Lib/test/test_long.py
+++ b/Lib/test/test_long.py
@@ -371,9 +371,10 @@ def test_float_overflow():
for x in -2.0, -1.0, 0.0, 1.0, 2.0:
verify(float(long(x)) == x)
+ shuge = '12345' * 1000
huge = 1L << 30000
mhuge = -huge
- namespace = {'huge': huge, 'mhuge': mhuge, 'math': math}
+ namespace = {'huge': huge, 'mhuge': mhuge, 'shuge': shuge, 'math': math}
for test in ["float(huge)", "float(mhuge)",
"complex(huge)", "complex(mhuge)",
"complex(huge, 1)", "complex(mhuge, 1)",
@@ -386,7 +387,8 @@ def test_float_overflow():
"1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.",
"math.sin(huge)", "math.sin(mhuge)",
"math.sqrt(huge)", "math.sqrt(mhuge)", # should do better
- "math.floor(huge)", "math.floor(mhuge)"]:
+ "math.floor(huge)", "math.floor(mhuge)",
+ "float(shuge) == int(shuge)"]:
try:
eval(test, namespace)
diff --git a/Misc/NEWS b/Misc/NEWS
index 971cfe0..028c21b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -23,6 +23,10 @@ Core and builtins
- Fixed crash when printing a subclass of str and __str__ returned self.
See SF bug #667147.
+- Fixed an invalid RuntimeWarning and an undetected error when trying
+ to convert a long integer into a float which couldn't fit.
+ See SF bug #676155.
+
Extension modules
-----------------
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index cd28349..09406e4 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -629,7 +629,10 @@ float_coerce(PyObject **pv, PyObject **pw)
return 0;
}
else if (PyLong_Check(*pw)) {
- *pw = PyFloat_FromDouble(PyLong_AsDouble(*pw));
+ double x = PyLong_AsDouble(*pw);
+ if (x == -1.0 && PyErr_Occurred())
+ return -1;
+ *pw = PyFloat_FromDouble(x);
Py_INCREF(*pv);
return 0;
}