mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
Fix SF bug# 676155, RuntimeWarning with tp_compare
Check return value of PyLong_AsDouble(), it can return an error.
This commit is contained in:
parent
54fb192508
commit
abcb0c03ad
4 changed files with 13 additions and 3 deletions
|
@ -186,6 +186,7 @@ class BuiltinTest(unittest.TestCase):
|
||||||
def __coerce__(self, other):
|
def __coerce__(self, other):
|
||||||
raise ValueError
|
raise ValueError
|
||||||
self.assertRaises(ValueError, coerce, 42, BadNumber())
|
self.assertRaises(ValueError, coerce, 42, BadNumber())
|
||||||
|
self.assertRaises(OverflowError, coerce, 0.5, int("12345" * 1000))
|
||||||
|
|
||||||
def test_compile(self):
|
def test_compile(self):
|
||||||
compile('print 1\n', '', 'exec')
|
compile('print 1\n', '', 'exec')
|
||||||
|
|
|
@ -371,9 +371,10 @@ def test_float_overflow():
|
||||||
for x in -2.0, -1.0, 0.0, 1.0, 2.0:
|
for x in -2.0, -1.0, 0.0, 1.0, 2.0:
|
||||||
verify(float(long(x)) == x)
|
verify(float(long(x)) == x)
|
||||||
|
|
||||||
|
shuge = '12345' * 1000
|
||||||
huge = 1L << 30000
|
huge = 1L << 30000
|
||||||
mhuge = -huge
|
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)",
|
for test in ["float(huge)", "float(mhuge)",
|
||||||
"complex(huge)", "complex(mhuge)",
|
"complex(huge)", "complex(mhuge)",
|
||||||
"complex(huge, 1)", "complex(mhuge, 1)",
|
"complex(huge, 1)", "complex(mhuge, 1)",
|
||||||
|
@ -386,7 +387,8 @@ def test_float_overflow():
|
||||||
"1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.",
|
"1. ** huge", "huge ** 1.", "1. ** mhuge", "mhuge ** 1.",
|
||||||
"math.sin(huge)", "math.sin(mhuge)",
|
"math.sin(huge)", "math.sin(mhuge)",
|
||||||
"math.sqrt(huge)", "math.sqrt(mhuge)", # should do better
|
"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:
|
try:
|
||||||
eval(test, namespace)
|
eval(test, namespace)
|
||||||
|
|
|
@ -23,6 +23,10 @@ Core and builtins
|
||||||
- Fixed crash when printing a subclass of str and __str__ returned self.
|
- Fixed crash when printing a subclass of str and __str__ returned self.
|
||||||
See SF bug #667147.
|
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
|
Extension modules
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
|
|
@ -629,7 +629,10 @@ float_coerce(PyObject **pv, PyObject **pw)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
else if (PyLong_Check(*pw)) {
|
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);
|
Py_INCREF(*pv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue