mirror of https://github.com/python/cpython
Test for issue16772 and redoes the previous fix to accept __index__-aware
objects as the base by using PyNumber_AsSsize_t similar to round().
This commit is contained in:
parent
83a2aa70af
commit
a689e524e7
|
@ -240,6 +240,30 @@ class IntTestCases(unittest.TestCase):
|
||||||
self.assertEquals(int(base=1000), 0)
|
self.assertEquals(int(base=1000), 0)
|
||||||
self.assertEquals(int(base='foo'), 0)
|
self.assertEquals(int(base='foo'), 0)
|
||||||
|
|
||||||
|
def test_int_base_limits(self):
|
||||||
|
"""Testing the supported limits of the int() base parameter."""
|
||||||
|
self.assertEqual(int('0', 5), 0)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
int('0', 1)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
int('0', 37)
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
int('0', -909) # An old magic value base from Python 2.
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
int('0', base=0-(2**234))
|
||||||
|
with self.assertRaises(ValueError):
|
||||||
|
int('0', base=2**234)
|
||||||
|
# Bases 2 through 36 are supported.
|
||||||
|
for base in range(2,37):
|
||||||
|
self.assertEqual(int('0', base=base), 0)
|
||||||
|
|
||||||
|
def test_int_base_bad_types(self):
|
||||||
|
"""Not integer types are not valid bases; issue16772."""
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
int('0', 5.5)
|
||||||
|
with self.assertRaises(TypeError):
|
||||||
|
int('0', 5.0)
|
||||||
|
|
||||||
def test_non_numeric_input_types(self):
|
def test_non_numeric_input_types(self):
|
||||||
# Test possible non-numeric types for the argument x, including
|
# Test possible non-numeric types for the argument x, including
|
||||||
# subclasses of the explicitly documented accepted types.
|
# subclasses of the explicitly documented accepted types.
|
||||||
|
|
|
@ -4247,8 +4247,7 @@ static PyObject *
|
||||||
long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
{
|
{
|
||||||
PyObject *obase = NULL, *x = NULL;
|
PyObject *obase = NULL, *x = NULL;
|
||||||
long base;
|
Py_ssize_t base;
|
||||||
int overflow;
|
|
||||||
static char *kwlist[] = {"x", "base", 0};
|
static char *kwlist[] = {"x", "base", 0};
|
||||||
|
|
||||||
if (type != &PyLong_Type)
|
if (type != &PyLong_Type)
|
||||||
|
@ -4266,10 +4265,10 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
base = PyLong_AsLongAndOverflow(obase, &overflow);
|
base = PyNumber_AsSsize_t(obase, NULL);
|
||||||
if (base == -1 && PyErr_Occurred())
|
if (base == -1 && PyErr_Occurred())
|
||||||
return NULL;
|
return NULL;
|
||||||
if (overflow || (base != 0 && base < 2) || base > 36) {
|
if ((base != 0 && base < 2) || base > 36) {
|
||||||
PyErr_SetString(PyExc_ValueError,
|
PyErr_SetString(PyExc_ValueError,
|
||||||
"int() arg 2 must be >= 2 and <= 36");
|
"int() arg 2 must be >= 2 and <= 36");
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
Loading…
Reference in New Issue