diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | insns.def | 2 | ||||
-rw-r--r-- | test/ruby/test_string.rb | 13 |
3 files changed, 21 insertions, 1 deletions
@@ -1,3 +1,10 @@ +Wed Mar 12 07:26:05 2014 Eric Wong <e@80x24.org> + + * insns.def (opt_regexpmatch2): respect redefined match op + Thanks to Sam Rawlins for the fix. + * test/ruby/test_string.rb: test based on Tsuyoshi Sawada's report + [Bug #9581] + Tue Mar 11 22:31:25 2014 Kazuki Tsujimoto <kazuki@callcc.net> * ext/.document: add objspace/objspace_dump.c to document file. @@ -2154,7 +2154,7 @@ opt_regexpmatch2 (VALUE obj2, VALUE obj1) (VALUE val) { - if (RB_TYPE_P(obj2, T_STRING) && + if (CLASS_OF(obj2) == rb_cString && BASIC_OP_UNREDEFINED_P(BOP_MATCH, STRING_REDEFINED_OP_FLAG)) { val = rb_reg_match(obj1, obj2); } diff --git a/test/ruby/test_string.rb b/test/ruby/test_string.rb index 7ce1c0666c..6cf45fd537 100644 --- a/test/ruby/test_string.rb +++ b/test/ruby/test_string.rb @@ -2219,6 +2219,19 @@ class TestString < Test::Unit::TestCase assert_equal("foo", "" =~ //) RUBY end + + class Bug9581 < String + def =~ re; :foo end + end + + def test_regexp_match_subclass + s = Bug9581.new("abc") + r = /abc/ + assert_equal(:foo, s =~ r) + assert_equal(:foo, s.send(:=~, r)) + assert_equal(:foo, s.send(:=~, /abc/)) + assert_equal(:foo, s =~ /abc/, "should not use optimized instruction") + end end class TestString2 < TestString |