Author: Armin Rigo <[email protected]>
Branch:
Changeset: r95071:942ad6c1866e
Date: 2018-09-02 11:15 +0200
http://bitbucket.org/pypy/pypy/changeset/942ad6c1866e/
Log: merge heads
diff --git a/rpython/rlib/rstring.py b/rpython/rlib/rstring.py
--- a/rpython/rlib/rstring.py
+++ b/rpython/rlib/rstring.py
@@ -464,6 +464,10 @@
raise InvalidBaseError("%s() base must be >= 2 and <= 36" % fname)
self.base = base
+ # Leading underscores are not allowed
+ if s.startswith('_'):
+ self.error()
+
if base == 16 and (s.startswith('0x') or s.startswith('0X')):
s = s[2:]
if base == 8 and (s.startswith('0o') or s.startswith('0O')):
diff --git a/rpython/rlib/test/test_rarithmetic.py
b/rpython/rlib/test/test_rarithmetic.py
--- a/rpython/rlib/test/test_rarithmetic.py
+++ b/rpython/rlib/test/test_rarithmetic.py
@@ -554,50 +554,52 @@
py.test.raises(ParseStringError, string_to_int, '+'+s, base)
py.test.raises(ParseStringError, string_to_int, '-'+s, base)
- def test_number_underscores(self):
- VALID_UNDERSCORE_LITERALS = [
- '0_0_0',
- '4_2',
- '1_0000_0000',
- '0b1001_0100',
- '0xfff_ffff',
- '0o5_7_7',
- '0b_0',
- '0x_f',
- '0o_5',
- ]
- INVALID_UNDERSCORE_LITERALS = [
- # Trailing underscores:
- '0_',
- '42_',
- '1.4j_',
- '0x_',
- '0b1_',
- '0xf_',
- '0o5_',
- # Underscores in the base selector:
- '0_b0',
- '0_xf',
- '0_o5',
- # Old-style octal, still disallowed:
- '09_99',
- # Multiple consecutive underscores:
- '4_______2',
- '0b1001__0100',
- '0xfff__ffff',
- '0x___',
- '0o5__77',
- '1e1__0',
- ]
- for x in VALID_UNDERSCORE_LITERALS:
- print x
- y = string_to_int(x, base=0, allow_underscores=True,
- no_implicit_octal=True)
- assert y == int(x.replace('_', ''), base=0)
- for x in INVALID_UNDERSCORE_LITERALS:
- print x
- py.test.raises(ParseStringError, string_to_int, x, base=0,
- allow_underscores=True)
+ @py.test.mark.parametrize('s', [
+ '0_0_0',
+ '4_2',
+ '1_0000_0000',
+ '0b1001_0100',
+ '0xfff_ffff',
+ '0o5_7_7',
+ '0b_0',
+ '0x_f',
+ '0o_5',
+ ])
+ def test_valid_underscores(self, s):
+ result = string_to_int(
+ s, base=0, allow_underscores=True, no_implicit_octal=True)
+ assert result == int(s.replace('_', ''), base=0)
+
+ @py.test.mark.parametrize('s', [
+ # Leading underscores
+ '_100',
+ '_',
+ '_0b1001_0100',
+ # Trailing underscores:
+ '0_',
+ '42_',
+ '1.4j_',
+ '0x_',
+ '0b1_',
+ '0xf_',
+ '0o5_',
+ # Underscores in the base selector:
+ '0_b0',
+ '0_xf',
+ '0_o5',
+ # Old-style octal, still disallowed:
+ '09_99',
+ # Multiple consecutive underscores:
+ '4_______2',
+ '0b1001__0100',
+ '0xfff__ffff',
+ '0x___',
+ '0o5__77',
+ '1e1__0',
+ ])
+ def test_invalid_underscores(self, s):
+ with py.test.raises(ParseStringError):
+ string_to_int(s, base=0, allow_underscores=True)
def test_no_implicit_octal(self):
TESTS = ['00', '000', '00_00', '02', '0377', '02_34']
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit