call PyErr_Clear() when ignoring error from PyNumber_Int (closes #15516)

Patch from Tom Tromey.
This commit is contained in:
Benjamin Peterson 2013-01-02 12:21:32 -06:00
parent 140794d6e7
commit a708adfcf6
3 changed files with 17 additions and 1 deletions

View File

@ -234,6 +234,16 @@ class FormatTest(unittest.TestCase):
testformat('%g', 1.1, '1.1') testformat('%g', 1.1, '1.1')
testformat('%#g', 1.1, '1.10000') testformat('%#g', 1.1, '1.10000')
# Regression test for http://bugs.python.org/issue15516.
class IntFails(object):
def __int__(self):
raise TestFailed
def __long__(self):
return 0
fst = IntFails()
testformat("%x", fst, '0')
# Test exception for unknown format characters # Test exception for unknown format characters
if verbose: if verbose:
print 'Testing exceptions' print 'Testing exceptions'

View File

@ -9,6 +9,9 @@ What's New in Python 2.7.4
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #15516: Fix a bug in PyString_FromFormat where it failed to properly
ignore errors from a __int__() method.
- Issue #16839: Fix a segfault when calling unicode() on a classic class early - Issue #16839: Fix a segfault when calling unicode() on a classic class early
in interpreter initialization. in interpreter initialization.

View File

@ -4489,7 +4489,10 @@ PyString_Format(PyObject *format, PyObject *args)
} }
else { else {
iobj = PyNumber_Int(v); iobj = PyNumber_Int(v);
if (iobj==NULL) iobj = PyNumber_Long(v); if (iobj==NULL) {
PyErr_Clear();
iobj = PyNumber_Long(v);
}
} }
if (iobj!=NULL) { if (iobj!=NULL) {
if (PyInt_Check(iobj)) { if (PyInt_Check(iobj)) {