There was an error while loading. Please reload this page.
1 parent ec47aff commit b5a630fCopy full SHA for b5a630f
3 files changed
Lib/test/test_int.py
@@ -506,5 +506,13 @@ def check(s, base=None):
506
check('123\ud800')
507
check('123\ud800', 10)
508
509
+ def test_issue31619(self):
510
+ self.assertEqual(int('1_0_1_0_1_0_1_0_1_0_1_0_1_0_1_0_1_0_1_0_1_0_1_0_1_0_1_0_1_0_1', 2),
511
+ 0b1010101010101010101010101010101)
512
+ self.assertEqual(int('1_2_3_4_5_6_7_0_1_2_3', 8), 0o12345670123)
513
+ self.assertEqual(int('1_2_3_4_5_6_7_8_9', 16), 0x123456789)
514
+ self.assertEqual(int('1_2_3_4_5_6_7', 32), 1144132807)
515
+
516
517
if __name__ == "__main__":
518
unittest.main()
Misc/NEWS.d/next/Core and Builtins/2017-09-29-20-32-24.bpo-31619.6gQ1kv.rst
@@ -0,0 +1,2 @@
1
+Fixed a ValueError when convert a string with large number of underscores
2
+to integer with binary base.
Objects/longobject.c
@@ -2049,15 +2049,15 @@ long_from_binary_base(const char **str, int base, PyLongObject **res)
2049
}
2050
2051
*str = p;
2052
- /* n <- # of Python digits needed, = ceiling(n/PyLong_SHIFT). */
2053
- n = digits * bits_per_char + PyLong_SHIFT - 1;
2054
- if (n / bits_per_char < p - start) {
+ /* n <- the number of Python digits needed,
+ = ceiling((digits * bits_per_char) / PyLong_SHIFT). */
+ if (digits > (PY_SSIZE_T_MAX - (PyLong_SHIFT - 1)) / bits_per_char) {
2055
PyErr_SetString(PyExc_ValueError,
2056
"int string too large to convert");
2057
*res = NULL;
2058
return 0;
2059
2060
- n = n / PyLong_SHIFT;
+ n = (digits * bits_per_char + PyLong_SHIFT - 1) / PyLong_SHIFT;
2061
z = _PyLong_New(n);
2062
if (z == NULL) {
2063
0 commit comments