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

ruby-changes:16551

From: knu <ko1@a...>
Date: Mon, 5 Jul 2010 16:12:03 +0900 (JST)
Subject: [ruby-changes:16551] Ruby:r28543 (trunk): * vm_method.c (rb_method_boundp): Return false for protected

knu	2010-07-05 16:11:44 +0900 (Mon, 05 Jul 2010)

  New Revision: 28543

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

  Log:
    * vm_method.c (rb_method_boundp): Return false for protected
      methods when called from Kernel#respond_to?. [ruby-dev:40461]

  Modified files:
    trunk/ChangeLog
    trunk/NEWS
    trunk/test/ruby/test_method.rb
    trunk/vm_method.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 28542)
+++ ChangeLog	(revision 28543)
@@ -1,3 +1,8 @@
+Mon Jul  5 16:05:39 2010  Akinori MUSHA  <knu@i...>
+
+	* vm_method.c (rb_method_boundp): Return false for protected
+	  methods when called from Kernel#respond_to?. [ruby-dev:40461]
+
 Mon Jul  5 12:32:01 2010  Aaron Patterson <aaron@t...>
 
 	* ext/psych/lib/psych/scalar_scanner.rb (parse_string): support
Index: vm_method.c
===================================================================
--- vm_method.c	(revision 28542)
+++ vm_method.c	(revision 28543)
@@ -566,8 +566,9 @@
     rb_method_entry_t *me = rb_method_entry(klass, id);
 
     if (me != 0) {
-	if ((ex & ~NOEX_RESPONDS) && (me->flag & NOEX_PRIVATE)) {
-	    return FALSE;
+	if ((ex &  NOEX_RESPONDS) && (me->flag & NOEX_PROTECTED) ||
+	    (ex & ~NOEX_RESPONDS) && (me->flag & NOEX_PRIVATE)) {
+	    return 0;
 	}
 	if (!me->def) return 0;
 	if (me->def->type == VM_METHOD_TYPE_NOTIMPLEMENTED) {
Index: NEWS
===================================================================
--- NEWS	(revision 28542)
+++ NEWS	(revision 28543)
@@ -8,6 +8,21 @@
 reference information is supplied with.  For a full list of changes
 with all sufficient information, see the ChangeLog file.
 
+== Changes since the 1.9.2 release
+=== Library updates (outstanding ones only)
+
+* builtin classes
+
+  * Kernel
+
+    * Kernel#respond_to? now returns false for protected methods.
+
+=== Compatibility issues (excluding feature bug fixes)
+
+* Kernel#respond_to?
+
+  See above.
+
 == Changes since the 1.9.1 release
 === Library updates (outstanding ones only)
 
Index: test/ruby/test_method.rb
===================================================================
--- test/ruby/test_method.rb	(revision 28542)
+++ test/ruby/test_method.rb	(revision 28543)
@@ -39,6 +39,20 @@
     def meth; end
   end
 
+  def mv1() end
+  def mv2() end
+  private :mv2
+  def mv3() end
+  protected :mv3
+
+  class Visibility
+    def mv1() end
+    def mv2() end
+    private :mv2
+    def mv3() end
+    protected :mv3
+  end
+
   def test_arity
     assert_equal(0, method(:m0).arity)
     assert_equal(1, method(:m1).arity)
@@ -345,4 +359,48 @@
     obj.extend(m)
     assert_equal([:m1, :a], obj.public_methods(false), bug)
   end
+
+  def test_visibility
+    assert_equal('method', defined?(mv1))
+    assert_equal('method', defined?(mv2))
+    assert_equal('method', defined?(mv3))
+
+    assert_equal('method', defined?(self.mv1))
+    assert_equal(nil, defined?(self.mv2))
+    assert_equal('method', defined?(self.mv3))
+
+    assert_equal(true,  respond_to?(:mv1))
+    assert_equal(false, respond_to?(:mv2))
+    assert_equal(false, respond_to?(:mv3))
+
+    assert_nothing_raised { mv1 }
+    assert_nothing_raised { mv2 }
+    assert_nothing_raised { mv3 }
+
+    assert_nothing_raised { self.mv1 }
+    assert_raise(NoMethodError) { self.mv2 }
+    assert_nothing_raised { self.mv3 }
+
+    v = Visibility.new
+
+    assert_equal('method', defined?(v.mv1))
+    assert_equal(nil, defined?(v.mv2))
+    assert_equal(nil, defined?(v.mv3))
+
+    assert_equal(true,  v.respond_to?(:mv1))
+    assert_equal(false, v.respond_to?(:mv2))
+    assert_equal(false, v.respond_to?(:mv3))
+
+    assert_nothing_raised { v.mv1 }
+    assert_raise(NoMethodError) { v.mv2 }
+    assert_raise(NoMethodError) { v.mv3 }
+
+    assert_nothing_raised { v.__send__(:mv1) }
+    assert_nothing_raised { v.__send__(:mv2) }
+    assert_nothing_raised { v.__send__(:mv3) }
+
+    assert_nothing_raised { v.instance_eval { mv1 } }
+    assert_nothing_raised { v.instance_eval { mv2 } }
+    assert_nothing_raised { v.instance_eval { mv3 } }
+  end
 end

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

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