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

ruby-changes:58290

From: Kenichi <ko1@a...>
Date: Thu, 17 Oct 2019 17:45:03 +0900 (JST)
Subject: [ruby-changes:58290] 2a22a6b2d8 (master): Regexp#match{?} with nil raises TypeError as String, Symbol (#1506)

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

From 2a22a6b2d8465934e75520a7fdcf522d50890caf Mon Sep 17 00:00:00 2001
From: Kenichi Kamiya <kachick1@g...>
Date: Thu, 17 Oct 2019 17:44:46 +0900
Subject: Regexp#match{?} with nil raises TypeError as String, Symbol (#1506)

* {String|Symbol}#match{?} with nil returns falsy

To improve consistency with Regexp#match{?}

* String#match(nil) returns `nil` instead of TypeError
* String#match?(nil) returns `false` instead of TypeError
* Symbol#match(nil) returns `nil` instead of TypeError
* Symbol#match?(nil) returns `false` instead of TypeError

* Prefer exception

* Follow empty ENV

* Drop outdated specs

* Write ruby/spec for above

https://github.com/ruby/ruby/pull/1506/files#r183242981

* Fix merge miss

diff --git a/re.c b/re.c
index 436316c..92eba92 100644
--- a/re.c
+++ b/re.c
@@ -3323,6 +3323,7 @@ rb_reg_match_m(int argc, VALUE *argv, VALUE re) https://github.com/ruby/ruby/blob/trunk/re.c#L3323
 	pos = 0;
     }
 
+    str = SYMBOL_P(str) ? rb_sym2str(str) : StringValue(str);
     pos = reg_match_pos(re, &str, pos);
     if (pos < 0) {
 	rb_backref_set(Qnil);
@@ -3368,7 +3369,6 @@ rb_reg_match_p(VALUE re, VALUE str, long pos) https://github.com/ruby/ruby/blob/trunk/re.c#L3369
     const UChar *start, *end;
     int tmpreg;
 
-    if (NIL_P(str)) return Qfalse;
     str = SYMBOL_P(str) ? rb_sym2str(str) : StringValue(str);
     if (pos) {
 	if (pos < 0) {
diff --git a/spec/ruby/core/regexp/match_spec.rb b/spec/ruby/core/regexp/match_spec.rb
index a68448b..cac2405 100644
--- a/spec/ruby/core/regexp/match_spec.rb
+++ b/spec/ruby/core/regexp/match_spec.rb
@@ -5,15 +5,15 @@ describe :regexp_match, shared: true do https://github.com/ruby/ruby/blob/trunk/spec/ruby/core/regexp/match_spec.rb#L5
   it "returns nil if there is no match" do
     /xyz/.send(@method,"abxyc").should be_nil
   end
-
-  it "returns nil if the object is nil" do
-    /\w+/.send(@method, nil).should be_nil
-  end
 end
 
 describe "Regexp#=~" do
   it_behaves_like :regexp_match, :=~
 
+  it "returns nil if the object is nil" do
+    (/\w+/ =~ nil).should be_nil
+  end
+
   it "returns the index of the first character of the matching region" do
     (/(.)(.)(.)/ =~ "abc").should == 0
   end
@@ -87,13 +87,21 @@ describe "Regexp#match" do https://github.com/ruby/ruby/blob/trunk/spec/ruby/core/regexp/match_spec.rb#L87
     end
   end
 
-  it "resets $~ if passed nil" do
-    # set $~
-    /./.match("a")
-    $~.should be_kind_of(MatchData)
+  ruby_version_is ""..."2.7" do
+    it "resets $~ if passed nil" do
+      # set $~
+      /./.match("a")
+      $~.should be_kind_of(MatchData)
+  
+      /1/.match(nil)
+      $~.should be_nil
+    end
+  end
 
-    /1/.match(nil)
-    $~.should be_nil
+  ruby_version_is "2.7" do
+    it "raises TypeError when the given argument is nil" do
+      -> { /foo/.match(nil) }.should raise_error(TypeError)
+    end
   end
 
   it "raises TypeError when the given argument cannot be coerced to String" do
@@ -129,8 +137,16 @@ describe "Regexp#match?" do https://github.com/ruby/ruby/blob/trunk/spec/ruby/core/regexp/match_spec.rb#L137
     /str/i.match?('string', 1).should be_false
   end
 
-  it "returns false when given nil" do
-    /./.match?(nil).should be_false
+  ruby_version_is ""..."2.7" do
+    it "returns false when given nil" do
+      /./.match?(nil).should be_false
+    end
+  end
+
+  ruby_version_is "2.7" do
+    it "raises TypeError when given nil" do
+      -> { /./.match?(nil) }.should raise_error(TypeError)
+    end
   end
 end
 
diff --git a/test/ruby/test_regexp.rb b/test/ruby/test_regexp.rb
index 6cfd7df..03e94a7 100644
--- a/test/ruby/test_regexp.rb
+++ b/test/ruby/test_regexp.rb
@@ -539,7 +539,7 @@ class TestRegexp < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_regexp.rb#L539
   end
 
   def test_match
-    assert_nil(//.match(nil))
+    assert_raise(TypeError) { //.match(nil) }
     assert_equal("abc", /.../.match(:abc)[0])
     assert_raise(TypeError) { /.../.match(Object.new)[0] }
     assert_equal("bc", /../.match('abc', 1)[0])
@@ -561,10 +561,10 @@ class TestRegexp < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_regexp.rb#L561
     /backref/ =~ 'backref'
     # must match here, but not in a separate method, e.g., assert_send,
     # to check if $~ is affected or not.
-    assert_equal(false, //.match?(nil))
     assert_equal(true, //.match?(""))
     assert_equal(true, /.../.match?(:abc))
     assert_raise(TypeError) { /.../.match?(Object.new) }
+    assert_raise(TypeError) { //.match?(nil) }
     assert_equal(true, /b/.match?('abc'))
     assert_equal(true, /b/.match?('abc', 1))
     assert_equal(true, /../.match?('abc', 1))
diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb
index dd403bf..41d4871 100644
--- a/test/ruby/test_string.rb
+++ b/test/ruby/test_string.rb
@@ -2512,6 +2512,7 @@ CODE https://github.com/ruby/ruby/blob/trunk/test/ruby/test_string.rb#L2512
 
   def test_match_method
     assert_equal("bar", "foobarbaz".match(/bar/).to_s)
+    assert_raise(TypeError) { "".match(nil) }
 
     o = Regexp.new('foo')
     def o.match(x, y, z); x + y + z; end
@@ -2567,6 +2568,10 @@ CODE https://github.com/ruby/ruby/blob/trunk/test/ruby/test_string.rb#L2568
     assert_equal('backref', $&)
   end
 
+  def test_match_p_nil
+    assert_raise(TypeError) { ''.match?(nil) }
+  end
+
   def test_clear
     s = "foo" * 100
     s.clear
diff --git a/test/ruby/test_symbol.rb b/test/ruby/test_symbol.rb
index 13d7cc9..d657f1a 100644
--- a/test/ruby/test_symbol.rb
+++ b/test/ruby/test_symbol.rb
@@ -367,6 +367,7 @@ class TestSymbol < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_symbol.rb#L367
 
   def test_match_method
     assert_equal("bar", :"foobarbaz".match(/bar/).to_s)
+    assert_raise(TypeError) { :"".match(nil) }
 
     o = Regexp.new('foo')
     def o.match(x, y, z); x + y + z; end
@@ -420,6 +421,10 @@ class TestSymbol < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_symbol.rb#L421
     assert_equal('backref', $&)
   end
 
+  def test_match_p_nil
+    assert_raise(TypeError) { :''.match?(nil) }
+  end
+
   def test_symbol_popped
     assert_nothing_raised { eval('a = 1; :"#{ a }"; 1') }
   end
-- 
cgit v0.10.2


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

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