Commit cd52a691 authored by Mark Dickinson's avatar Mark Dickinson

Issue #2844: Make int('42', n) consistently raise ValueError for

invalid integers n (including n = -909).
parent 46812b39
...@@ -345,6 +345,16 @@ class LongTest(unittest.TestCase): ...@@ -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? ...@@ -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); ...@@ -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) ...@@ -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,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment