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/