summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2019-04-26 19:38:43 +0200
committerJean Boussier <jean.boussier@gmail.com>2019-04-26 19:38:43 +0200
commit7d04834b79aa6677b1bff42161311cb79809ed7d (patch)
tree3b6c934a64f8660c0bbc5091c1cb58b342a23a26
parenta28037330ff1507fe014b85a44b96034c24ba48d (diff)
downloadpsych-7d04834b79aa6677b1bff42161311cb79809ed7d.tar.gz
Do not allocate a string to check if a scalar is an integer
-rw-r--r--lib/psych/scalar_scanner.rb16
-rw-r--r--test/psych/test_scalar_scanner.rb17
2 files changed, 24 insertions, 9 deletions
diff --git a/lib/psych/scalar_scanner.rb b/lib/psych/scalar_scanner.rb
index e92fe27..cea2a45 100644
--- a/lib/psych/scalar_scanner.rb
+++ b/lib/psych/scalar_scanner.rb
@@ -14,10 +14,10 @@ module Psych
|\.(nan|NaN|NAN)(?# not a number))$/x
# Taken from http://yaml.org/type/int.html
- INTEGER = /^(?:[-+]?0b[0-1_]+ (?# base 2)
- |[-+]?0[0-7_]+ (?# base 8)
- |[-+]?(?:0|[1-9][0-9_]*) (?# base 10)
- |[-+]?0x[0-9a-fA-F_]+ (?# base 16))$/x
+ INTEGER = /^(?:[-+]?0b[0-1_,]+ (?# base 2)
+ |[-+]?0[0-7_,]+ (?# base 8)
+ |[-+]?(?:0|[1-9][0-9_,]*) (?# base 10)
+ |[-+]?0x[0-9a-fA-F_,]+ (?# base 16))$/x
attr_reader :class_loader
@@ -91,10 +91,9 @@ module Psych
else
Float(string.gsub(/[,_]|\.([Ee]|$)/, '\1'))
end
+ elsif string.match?(INTEGER)
+ parse_int string
else
- int = parse_int string.gsub(/[,_]/, '')
- return int if int
-
string
end
end
@@ -102,8 +101,7 @@ module Psych
###
# Parse and return an int from +string+
def parse_int string
- return unless INTEGER === string
- Integer(string)
+ Integer(string.gsub(/[,]/, ''))
end
###
diff --git a/test/psych/test_scalar_scanner.rb b/test/psych/test_scalar_scanner.rb
index ebe8daf..d12a905 100644
--- a/test/psych/test_scalar_scanner.rb
+++ b/test/psych/test_scalar_scanner.rb
@@ -113,5 +113,22 @@ module Psych
def test_scan_strings_starting_with_underscores
assert_equal "_100", ss.tokenize('_100')
end
+
+ def test_scan_int_commas_and_underscores
+ # NB: This test is to ensure backward compatibility with prior Psych versions,
+ # not to test against any actual YAML specification.
+ assert_equal 123_456_789, ss.tokenize('123_456_789')
+ assert_equal 123_456_789, ss.tokenize('123,456,789')
+ assert_equal 123_456_789, ss.tokenize('1_2,3,4_5,6_789')
+
+ assert_equal 0b010101010, ss.tokenize('0b010101010')
+ assert_equal 0b010101010, ss.tokenize('0b0,1_0,1_,0,1_01,0')
+
+ assert_equal 01234567, ss.tokenize('01234567')
+ assert_equal 01234567, ss.tokenize('0_,,,1_2,_34567')
+
+ assert_equal 0x123456789abcdef, ss.tokenize('0x123456789abcdef')
+ assert_equal 0x123456789abcdef, ss.tokenize('0x12_,34,_56,_789abcdef')
+ end
end
end