[前][次][番号順一覧][スレッド一覧]

ruby-changes:67499

From: Tomer <ko1@a...>
Date: Tue, 31 Aug 2021 19:36:32 +0900 (JST)
Subject: [ruby-changes:67499] 31ba0921f8 (master): [ruby/psych] Improve float scalar scanner

https://git.ruby-lang.org/ruby.git/commit/?id=31ba0921f8

From 31ba0921f8fe342ce317b1c9638b23756bffc9ff Mon Sep 17 00:00:00 2001
From: Tomer Brisker <tbrisker@g...>
Date: Sat, 8 Aug 2020 14:46:05 +0300
Subject: [ruby/psych] Improve float scalar scanner

Previously, `+.inf` was not handled correctly. Additionally, the regexp
was checking for inf and NaN, even though these cases are handled earlier
in the condition. Added a few tests to ensure handling some missing
cases.

https://github.com/ruby/psych/commit/6e0e7a1e9f
---
 ext/psych/lib/psych/scalar_scanner.rb |  7 +++----
 test/psych/test_scalar_scanner.rb     | 12 ++++++++++++
 2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/ext/psych/lib/psych/scalar_scanner.rb b/ext/psych/lib/psych/scalar_scanner.rb
index d565a33..01f7a2e 100644
--- a/ext/psych/lib/psych/scalar_scanner.rb
+++ b/ext/psych/lib/psych/scalar_scanner.rb
@@ -9,9 +9,8 @@ module Psych https://github.com/ruby/ruby/blob/trunk/ext/psych/lib/psych/scalar_scanner.rb#L9
     TIME = /^-?\d{4}-\d{1,2}-\d{1,2}(?:[Tt]|\s+)\d{1,2}:\d\d:\d\d(?:\.\d*)?(?:\s*(?:Z|[-+]\d{1,2}:?(?:\d\d)?))?$/
 
     # Taken from http://yaml.org/type/float.html
-    FLOAT = /^(?:[-+]?([0-9][0-9_,]*)?\.[0-9]*([eE][-+][0-9]+)?(?# base 10)
-              |[-+]?\.(inf|Inf|INF)(?# infinity)
-              |\.(nan|NaN|NAN)(?# not a number))$/x
+    # Base 60, [-+]inf and NaN are handled separately
+    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)
@@ -61,7 +60,7 @@ module Psych https://github.com/ruby/ruby/blob/trunk/ext/psych/lib/psych/scalar_scanner.rb#L60
         rescue ArgumentError
           string
         end
-      elsif string.match?(/^\.inf$/i)
+      elsif string.match?(/^\+?\.inf$/i)
         Float::INFINITY
       elsif string.match?(/^-\.inf$/i)
         -Float::INFINITY
diff --git a/test/psych/test_scalar_scanner.rb b/test/psych/test_scalar_scanner.rb
index 1bd6488..ec67a33 100644
--- a/test/psych/test_scalar_scanner.rb
+++ b/test/psych/test_scalar_scanner.rb
@@ -66,6 +66,10 @@ module Psych https://github.com/ruby/ruby/blob/trunk/test/psych/test_scalar_scanner.rb#L66
       assert_equal(1 / 0.0, ss.tokenize('.inf'))
     end
 
+    def test_scan_plus_inf
+      assert_equal(1 / 0.0, ss.tokenize('+.inf'))
+    end
+
     def test_scan_minus_inf
       assert_equal(-1 / 0.0, ss.tokenize('-.inf'))
     end
@@ -133,5 +137,13 @@ module Psych https://github.com/ruby/ruby/blob/trunk/test/psych/test_scalar_scanner.rb#L137
       assert_equal 0x123456789abcdef, ss.tokenize('0x_12_,34,_56,_789abcdef')
       assert_equal 0x123456789abcdef, ss.tokenize('0x12_,34,_56,_789abcdef__')
     end
+
+    def test_scan_dot
+      assert_equal '.', ss.tokenize('.')
+    end
+
+    def test_scan_plus_dot
+      assert_equal '+.', ss.tokenize('+.')
+    end
   end
 end
-- 
cgit v1.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]