Skip to content

Commit

Permalink
Issue python#2844: Make int('42', n) consistently raise ValueError for
Browse files Browse the repository at this point in the history
invalid integers n (including n = -909).
  • Loading branch information
mdickinson committed May 26, 2010
1 parent d5442cd commit f9a5a8e
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 9 deletions.
10 changes: 10 additions & 0 deletions Lib/test/test_long.py
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,16 @@ def test_long(self):
self.assertRaises(ValueError, int, '08', 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):

class JustLong:
Expand Down
3 changes: 3 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ What's New in Python 3.2 Alpha 1?
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
(instances of int, float, complex, decimal.Decimal and
fractions.Fraction) that makes it easy to maintain the invariant
Expand Down
29 changes: 20 additions & 9 deletions Objects/longobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -4098,23 +4098,34 @@ long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
static PyObject *
long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
PyObject *x = NULL;
int base = -909; /* unlikely! */
PyObject *obase = NULL, *x = NULL;
long base;
int overflow;
static char *kwlist[] = {"x", "base", 0};

if (type != &PyLong_Type)
return long_subtype_new(type, args, kwds); /* Wimp out */
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
&x, &base))
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:int", kwlist,
&x, &obase))
return NULL;
if (x == NULL)
return PyLong_FromLong(0L);
if (base == -909)
if (obase == NULL)
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),
PyUnicode_GET_SIZE(x),
base);
(int)base);
else if (PyByteArray_Check(x) || PyBytes_Check(x)) {
/* Since PyLong_FromString doesn't have a length parameter,
* check here for possible NULs in the string. */
Expand All @@ -4129,10 +4140,10 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
x is a bytes or buffer, *and* a base is given. */
PyErr_Format(PyExc_ValueError,
"invalid literal for int() with base %d: %R",
base, x);
(int)base, x);
return NULL;
}
return PyLong_FromString(string, NULL, base);
return PyLong_FromString(string, NULL, (int)base);
}
else {
PyErr_SetString(PyExc_TypeError,
Expand Down

0 comments on commit f9a5a8e

Please sign in to comment.