Commit 2336bddd authored by Facundo Batista's avatar Facundo Batista

Fix Issue #1769: Now int('- 1') or int('+ 1') is not allowed

any more.  Thanks Juan Jose Conti.  Also added tests.
parent 587c2bfe
...@@ -49,7 +49,7 @@ class BitBucket: ...@@ -49,7 +49,7 @@ class BitBucket:
def write(self, line): def write(self, line):
pass pass
L = [ test_conv_no_sign = [
('0', 0), ('0', 0),
('1', 1), ('1', 1),
('9', 9), ('9', 9),
...@@ -71,6 +71,28 @@ L = [ ...@@ -71,6 +71,28 @@ L = [
(chr(0x200), ValueError), (chr(0x200), ValueError),
] ]
test_conv_sign = [
('0', 0),
('1', 1),
('9', 9),
('10', 10),
('99', 99),
('100', 100),
('314', 314),
(' 314', ValueError),
('314 ', 314),
(' \t\t 314 \t\t ', ValueError),
(repr(sys.maxsize), sys.maxsize),
(' 1x', ValueError),
(' 1 ', ValueError),
(' 1\02 ', ValueError),
('', ValueError),
(' ', ValueError),
(' \t\t ', ValueError),
(str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
(chr(0x200), ValueError),
]
class TestFailingBool: class TestFailingBool:
def __bool__(self): def __bool__(self):
raise RuntimeError raise RuntimeError
...@@ -641,8 +663,18 @@ class BuiltinTest(unittest.TestCase): ...@@ -641,8 +663,18 @@ class BuiltinTest(unittest.TestCase):
# Different base: # Different base:
self.assertEqual(int("10",16), 16) self.assertEqual(int("10",16), 16)
# Test conversion from strings and various anomalies # Test conversion from strings and various anomalies
for s, v in L: # Testing with no sign at front
for sign in "", "+", "-": for s, v in test_conv_no_sign:
for prefix in "", " ", "\t", " \t\t ":
ss = prefix + s
vv = v
try:
self.assertEqual(int(ss), vv)
except v:
pass
# No whitespaces allowed between + or - sign and the number
for s, v in test_conv_sign:
for sign in "+", "-":
for prefix in "", " ", "\t", " \t\t ": for prefix in "", " ", "\t", " \t\t ":
ss = prefix + sign + s ss = prefix + sign + s
vv = v vv = v
......
...@@ -12,6 +12,8 @@ What's New in Python 3.0a3? ...@@ -12,6 +12,8 @@ What's New in Python 3.0a3?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #1769: Now int("- 1") is not allowed any more.
- Object/longobject.c: long(float('nan')) raises an OverflowError instead - Object/longobject.c: long(float('nan')) raises an OverflowError instead
of returning 0. of returning 0.
......
...@@ -1685,8 +1685,6 @@ PyLong_FromString(char *str, char **pend, int base) ...@@ -1685,8 +1685,6 @@ PyLong_FromString(char *str, char **pend, int base)
++str; ++str;
sign = -1; sign = -1;
} }
while (*str != '\0' && isspace(Py_CHARMASK(*str)))
str++;
if (base == 0) { if (base == 0) {
if (str[0] != '0') if (str[0] != '0')
base = 10; base = 10;
......
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