mirror of https://github.com/python/cpython
Issue #2844: Make int('42', n) consistently raise ValueError for
invalid integers n (including n = -909).
This commit is contained in:
parent
d5442cd37a
commit
f9a5a8e0af
|
@ -345,6 +345,16 @@ class LongTest(unittest.TestCase):
|
||||||
self.assertRaises(ValueError, int, '08', 0)
|
self.assertRaises(ValueError, int, '08', 0)
|
||||||
self.assertRaises(ValueError, int, '-012395', 0)
|
self.assertRaises(ValueError, int, '-012395', 0)
|
||||||
|
|
||||||
|
# invalid bases
|
||||||
|
invalid_bases = [-909,
|
||||||
|
2**31-1, 2**31, -2**31, -2**31-1,
|
||||||
|
2**63-1, 2**63, -2**63, -2**63-1,
|
||||||
|
2**100, -2**100,
|
||||||
|
]
|
||||||
|
for base in invalid_bases:
|
||||||
|
self.assertRaises(ValueError, int, '42', base)
|
||||||
|
|
||||||
|
|
||||||
def test_conversion(self):
|
def test_conversion(self):
|
||||||
|
|
||||||
class JustLong:
|
class JustLong:
|
||||||
|
|
|
@ -12,6 +12,9 @@ What's New in Python 3.2 Alpha 1?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #2844: Make int('42', n) consistently raise ValueError for
|
||||||
|
invalid integers n (including n = -909).
|
||||||
|
|
||||||
- Issue #8188: Introduce a new scheme for computing hashes of numbers
|
- Issue #8188: Introduce a new scheme for computing hashes of numbers
|
||||||
(instances of int, float, complex, decimal.Decimal and
|
(instances of int, float, complex, decimal.Decimal and
|
||||||
fractions.Fraction) that makes it easy to maintain the invariant
|
fractions.Fraction) that makes it easy to maintain the invariant
|
||||||
|
|
|
@ -4098,23 +4098,34 @@ long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
|
||||||
static PyObject *
|
static PyObject *
|
||||||
long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
{
|
{
|
||||||
PyObject *x = NULL;
|
PyObject *obase = NULL, *x = NULL;
|
||||||
int base = -909; /* unlikely! */
|
long base;
|
||||||
|
int overflow;
|
||||||
static char *kwlist[] = {"x", "base", 0};
|
static char *kwlist[] = {"x", "base", 0};
|
||||||
|
|
||||||
if (type != &PyLong_Type)
|
if (type != &PyLong_Type)
|
||||||
return long_subtype_new(type, args, kwds); /* Wimp out */
|
return long_subtype_new(type, args, kwds); /* Wimp out */
|
||||||
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
|
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:int", kwlist,
|
||||||
&x, &base))
|
&x, &obase))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (x == NULL)
|
if (x == NULL)
|
||||||
return PyLong_FromLong(0L);
|
return PyLong_FromLong(0L);
|
||||||
if (base == -909)
|
if (obase == NULL)
|
||||||
return PyNumber_Long(x);
|
return PyNumber_Long(x);
|
||||||
else if (PyUnicode_Check(x))
|
|
||||||
|
base = PyLong_AsLongAndOverflow(obase, &overflow);
|
||||||
|
if (base == -1 && PyErr_Occurred())
|
||||||
|
return NULL;
|
||||||
|
if (overflow || (base != 0 && base < 2) || base > 36) {
|
||||||
|
PyErr_SetString(PyExc_ValueError,
|
||||||
|
"int() arg 2 must be >= 2 and <= 36");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PyUnicode_Check(x))
|
||||||
return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
|
return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
|
||||||
PyUnicode_GET_SIZE(x),
|
PyUnicode_GET_SIZE(x),
|
||||||
base);
|
(int)base);
|
||||||
else if (PyByteArray_Check(x) || PyBytes_Check(x)) {
|
else if (PyByteArray_Check(x) || PyBytes_Check(x)) {
|
||||||
/* Since PyLong_FromString doesn't have a length parameter,
|
/* Since PyLong_FromString doesn't have a length parameter,
|
||||||
* check here for possible NULs in the string. */
|
* check here for possible NULs in the string. */
|
||||||
|
@ -4129,10 +4140,10 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
|
||||||
x is a bytes or buffer, *and* a base is given. */
|
x is a bytes or buffer, *and* a base is given. */
|
||||||
PyErr_Format(PyExc_ValueError,
|
PyErr_Format(PyExc_ValueError,
|
||||||
"invalid literal for int() with base %d: %R",
|
"invalid literal for int() with base %d: %R",
|
||||||
base, x);
|
(int)base, x);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return PyLong_FromString(string, NULL, base);
|
return PyLong_FromString(string, NULL, (int)base);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
PyErr_SetString(PyExc_TypeError,
|
PyErr_SetString(PyExc_TypeError,
|
||||||
|
|
Loading…
Reference in New Issue