summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandr Opak <opak.alexandr@gmail.com>2021-01-29 13:04:37 +0100
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2021-08-31 19:34:13 +0900
commit48b50cb4febc37120a6026dc95a4a868360048eb (patch)
treefc90fd99ba3e9f6b52d766a2b8839e91bc408aca
parent31ba0921f8fe342ce317b1c9638b23756bffc9ff (diff)
[ruby/psych] fix parsing integer values with '_' at the end
https://github.com/ruby/psych/commit/e0bb853014
-rw-r--r--ext/psych/lib/psych/scalar_scanner.rb8
-rw-r--r--test/psych/test_scalar_scanner.rb9
2 files changed, 12 insertions, 5 deletions
diff --git a/ext/psych/lib/psych/scalar_scanner.rb b/ext/psych/lib/psych/scalar_scanner.rb
index 01f7a2ef1c..eecd46ebe8 100644
--- a/ext/psych/lib/psych/scalar_scanner.rb
+++ b/ext/psych/lib/psych/scalar_scanner.rb
@@ -13,10 +13,10 @@ module Psych
FLOAT = /^(?:[-+]?([0-9][0-9_,]*)?\.[0-9]*([eE][-+][0-9]+)?(?# base 10))$/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)
+ |[-+]?(?:\d|[1-9][0-9_,]*[^_]) (?# base 10)
+ |[-+]?0x[0-9a-fA-F_,]+ (?# base 16))$/x
attr_reader :class_loader
diff --git a/test/psych/test_scalar_scanner.rb b/test/psych/test_scalar_scanner.rb
index ec67a33835..e489b20a0f 100644
--- a/test/psych/test_scalar_scanner.rb
+++ b/test/psych/test_scalar_scanner.rb
@@ -118,13 +118,20 @@ module Psych
assert_equal "_100", ss.tokenize('_100')
end
+ def test_scan_strings_ending_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 123_456_789, ss.tokenize('1_2,3,4_5,6_789_')
+
+ assert_equal 1, ss.tokenize('1')
+ assert_equal 1 ss.tokenize('+1')
+ assert_equal -1 ss.tokenize('-1')
assert_equal 0b010101010, ss.tokenize('0b010101010')
assert_equal 0b010101010, ss.tokenize('0b0,1_0,1_,0,1_01,0')