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

ruby-changes:74181

From: Yusuke <ko1@a...>
Date: Fri, 21 Oct 2022 16:36:04 +0900 (JST)
Subject: [ruby-changes:74181] e026368061 (master): Range#size returns nil for (.."a") and (nil..)

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

From e026368061c56bc925aff58910a4b02f18b78c70 Mon Sep 17 00:00:00 2001
From: Yusuke Endoh <mame@r...>
Date: Fri, 21 Oct 2022 13:39:15 +0900
Subject: Range#size returns nil for (.."a") and (nil..)

Fixes [Bug #18983]
---
 range.c                           |  4 +++-
 spec/ruby/core/range/size_spec.rb | 27 ++++++++++++++++++++++-----
 test/ruby/test_range.rb           |  3 +++
 3 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/range.c b/range.c
index b49b1bd79c..a2c0e21860 100644
--- a/range.c
+++ b/range.c
@@ -816,7 +816,9 @@ range_size(VALUE range) https://github.com/ruby/ruby/blob/trunk/range.c#L816
         }
     }
     else if (NIL_P(b)) {
-        return DBL2NUM(HUGE_VAL);
+        if (rb_obj_is_kind_of(e, rb_cNumeric)) {
+            return DBL2NUM(HUGE_VAL);
+        }
     }
 
     return Qnil;
diff --git a/spec/ruby/core/range/size_spec.rb b/spec/ruby/core/range/size_spec.rb
index 5462a1a5e1..9b625c9963 100644
--- a/spec/ruby/core/range/size_spec.rb
+++ b/spec/ruby/core/range/size_spec.rb
@@ -34,11 +34,28 @@ describe "Range#size" do https://github.com/ruby/ruby/blob/trunk/spec/ruby/core/range/size_spec.rb#L34
     eval("([]...)").size.should == nil
   end
 
-  it 'returns Float::INFINITY for all beginless ranges' do
-    (..1).size.should == Float::INFINITY
-    (...0.5).size.should == Float::INFINITY
-    (..nil).size.should == Float::INFINITY
-    (...'o').size.should == Float::INFINITY
+  ruby_version_is ""..."3.2" do
+    it 'returns Float::INFINITY for all beginless ranges' do
+      (..1).size.should == Float::INFINITY
+      (...0.5).size.should == Float::INFINITY
+      (..nil).size.should == Float::INFINITY
+      (...'o').size.should == Float::INFINITY
+    end
+  end
+
+  ruby_version_is "3.2" do
+    it 'returns Float::INFINITY for all beginless ranges if the start is numeric' do
+      (..1).size.should == Float::INFINITY
+      (...0.5).size.should == Float::INFINITY
+    end
+
+    it 'returns nil for all beginless ranges if the start is numeric' do
+      (...'o').size.should == nil
+    end
+
+    it 'returns nil if the start and the end is both nil' do
+      (nil..nil).size.should == nil
+    end
   end
 
   it "returns nil if first and last are not Numeric" do
diff --git a/test/ruby/test_range.rb b/test/ruby/test_range.rb
index 0df0a985ad..2c07cef96e 100644
--- a/test/ruby/test_range.rb
+++ b/test/ruby/test_range.rb
@@ -777,6 +777,9 @@ class TestRange < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_range.rb#L777
     assert_equal 5, (1.1...6).size
     assert_equal 42, (1..42).each.size
     assert_nil ("a"..."z").size
+    assert_nil ("a"...).size
+    assert_nil (..."z").size    # [Bug #18983]
+    assert_nil (nil...nil).size # [Bug #18983]
 
     assert_equal Float::INFINITY, (1...).size
     assert_equal Float::INFINITY, (1.0...).size
-- 
cgit v1.2.3


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

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