summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-07-07 04:06:32 +0000
committerknu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-07-07 04:06:32 +0000
commit42f4a548f0e8ad0fa22a4132b164c7ab76e3bf45 (patch)
tree75f76f6c035454a93744937d9fe42530b3897e97
parent2520f3f79c0b65894cea4914c041f06b8d29b41a (diff)
* vm_method.c (rb_method_boundp): respond_to?(:protected_method,
true) should return true. Pointed out by Marc-Andre Lafortune. [ruby-dev:41837] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28564 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--test/ruby/test_method.rb14
-rw-r--r--vm_method.c22
3 files changed, 28 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 9492355913..fd3c7e2d9e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Jul 7 13:02:59 2010 Akinori MUSHA <knu@iDaemons.org>
+
+ * vm_method.c (rb_method_boundp): respond_to?(:protected_method,
+ true) should return true. Pointed out by Marc-Andre Lafortune.
+ [ruby-dev:41837]
+
Wed Jul 7 12:00:24 2010 NAKAMURA Usaku <usa@ruby-lang.org>
* file.c (ruby_find_basename): should initialize f.
diff --git a/test/ruby/test_method.rb b/test/ruby/test_method.rb
index 61f523e4e1..d135577208 100644
--- a/test/ruby/test_method.rb
+++ b/test/ruby/test_method.rb
@@ -366,13 +366,17 @@ class TestMethod < Test::Unit::TestCase
assert_equal('method', defined?(mv3))
assert_equal('method', defined?(self.mv1))
- assert_equal(nil, defined?(self.mv2))
+ 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_equal(true, respond_to?(:mv1, true))
+ assert_equal(true, respond_to?(:mv2, true))
+ assert_equal(true, respond_to?(:mv3, true))
+
assert_nothing_raised { mv1 }
assert_nothing_raised { mv2 }
assert_nothing_raised { mv3 }
@@ -384,13 +388,17 @@ class TestMethod < Test::Unit::TestCase
v = Visibility.new
assert_equal('method', defined?(v.mv1))
- assert_equal(nil, defined?(v.mv2))
- assert_equal(nil, defined?(v.mv3))
+ 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_equal(true, v.respond_to?(:mv1, true))
+ assert_equal(true, v.respond_to?(:mv2, true))
+ assert_equal(true, v.respond_to?(:mv3, true))
+
assert_nothing_raised { v.mv1 }
assert_raise(NoMethodError) { v.mv2 }
assert_raise(NoMethodError) { v.mv3 }
diff --git a/vm_method.c b/vm_method.c
index becce27c1c..aa5db73643 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -565,19 +565,19 @@ rb_method_boundp(VALUE klass, ID id, int ex)
{
rb_method_entry_t *me = rb_method_entry(klass, id);
- if (me != 0) {
- 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) {
- if (ex & NOEX_RESPONDS) return 2;
- return 0;
+ if (!me) return 0;
+ if (ex & ~NOEX_RESPONDS) { /* pub */
+ if (me->flag & NOEX_PRIVATE) return 0;
+ if (ex & NOEX_RESPONDS) {
+ if (me->flag & NOEX_PROTECTED) return 0;
}
- return 1;
}
- return 0;
+ if (!me->def) return 0;
+ if (me->def->type == VM_METHOD_TYPE_NOTIMPLEMENTED) {
+ if (ex & NOEX_RESPONDS) return 2;
+ return 0;
+ }
+ return 1;
}
void