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

ruby-changes:30973

From: sorah <ko1@a...>
Date: Thu, 26 Sep 2013 16:58:35 +0900 (JST)
Subject: [ruby-changes:30973] sorah:r43052 (trunk): * insns.def (opt_regexpmatch2): Check String#=~ hasn't overridden

sorah	2013-09-26 16:58:28 +0900 (Thu, 26 Sep 2013)

  New Revision: 43052

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=43052

  Log:
    * insns.def (opt_regexpmatch2): Check String#=~ hasn't overridden
      before calling rb_reg_match().
    
    * test/ruby/test_string.rb: Test for above.
    
    * vm.c (vm_init_redefined_flag): Add BOP flag for String#=~
    
    [ruby-core:57385] [Bug #8953]

  Modified files:
    trunk/ChangeLog
    trunk/insns.def
    trunk/test/ruby/test_string.rb
    trunk/vm.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 43051)
+++ ChangeLog	(revision 43052)
@@ -1,3 +1,14 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Thu Sep 26 16:51:00 2013  Shota Fukumori  <her@s...>
+
+	* insns.def (opt_regexpmatch2): Check String#=~ hasn't overridden
+	  before calling rb_reg_match().
+
+	* test/ruby/test_string.rb: Test for above.
+
+	* vm.c (vm_init_redefined_flag): Add BOP flag for String#=~
+
+	[ruby-core:57385] [Bug #8953]
+
 Thu Sep 26 16:43:42 2013  Akinori MUSHA  <knu@i...>
 
 	* misc/ruby-electric.el: Avoid use of the interactive function
Index: insns.def
===================================================================
--- insns.def	(revision 43051)
+++ insns.def	(revision 43052)
@@ -2098,7 +2098,8 @@ opt_regexpmatch2 https://github.com/ruby/ruby/blob/trunk/insns.def#L2098
 (VALUE obj2, VALUE obj1)
 (VALUE val)
 {
-    if (RB_TYPE_P(obj2, T_STRING)) {
+    if (RB_TYPE_P(obj2, T_STRING) &&
+	BASIC_OP_UNREDEFINED_P(BOP_MATCH, STRING_REDEFINED_OP_FLAG)) {
 	val = rb_reg_match(obj1, obj2);
     }
     else {
Index: vm.c
===================================================================
--- vm.c	(revision 43051)
+++ vm.c	(revision 43052)
@@ -1095,7 +1095,7 @@ vm_init_redefined_flag(void) https://github.com/ruby/ruby/blob/trunk/vm.c#L1095
     OP(Size, SIZE), (C(Array), C(String), C(Hash));
     OP(EmptyP, EMPTY_P), (C(Array), C(String), C(Hash));
     OP(Succ, SUCC), (C(Fixnum), C(String), C(Time));
-    OP(EqTilde, MATCH), (C(Regexp));
+    OP(EqTilde, MATCH), (C(Regexp), C(String));
 #undef C
 #undef OP
 }
Index: test/ruby/test_string.rb
===================================================================
--- test/ruby/test_string.rb	(revision 43051)
+++ test/ruby/test_string.rb	(revision 43052)
@@ -2256,6 +2256,18 @@ class TestString < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/test/ruby/test_string.rb#L2256
     assert_equal Encoding::UTF_8, a.encoding
     assert_equal Encoding::US_ASCII, b.encoding
   end
+
+  def test_eq_tilde_can_be_overridden
+    assert_in_out_err([], <<-RUBY, ["foo"], [])
+      class String
+        def =~(str)
+          "foo"
+        end
+      end
+
+      puts "" =~ //
+    RUBY
+  end
 end
 
 class TestString2 < TestString

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

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