summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-26 16:05:30 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-07-26 16:05:30 +0000
commit298349d03bcdb6c25420d9a92265816d59892a1f (patch)
treeefd250ee3f71d001f05d1d2ecb072cd05473f2c4
parent3fbc65d47fe8d446dde8fe77d3b76fb81f8ffba1 (diff)
* vm_method.c (obj_respond_to): fix the respond_to_missing? override
case. based on the patch by Jeremy Evans at [ruby-core:38417]. [Feature #5072] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32685 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog6
-rw-r--r--test/ruby/test_object.rb13
-rw-r--r--vm_method.c9
3 files changed, 26 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index cc2070a716..8ea7578e09 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,8 @@
-Wed Jul 27 01:05:23 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Jul 27 01:05:28 2011 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_method.c (obj_respond_to): fix the respond_to_missing? override
+ case. based on the patch by Jeremy Evans at [ruby-core:38417].
+ [Feature #5072]
* parse.y (rb_check_id): make the given name a symbol or a string.
based on the second patch by Jeremy Evans at [ruby-core:38447]
diff --git a/test/ruby/test_object.rb b/test/ruby/test_object.rb
index 2935885431..c4f0f79db3 100644
--- a/test/ruby/test_object.rb
+++ b/test/ruby/test_object.rb
@@ -334,6 +334,19 @@ class TestObject < Test::Unit::TestCase
assert_nothing_raised(bug2494) {[b].flatten}
end
+ def test_respond_to_missing_string
+ c = Class.new do
+ def respond_to_missing?(id, priv)
+ !(id !~ /\Agadzoks\d+\z/) ^ priv
+ end
+ end
+ foo = c.new
+ assert_equal(false, foo.respond_to?("gadzooks16"))
+ assert_equal(true, foo.respond_to?("gadzooks17", true))
+ assert_equal(true, foo.respond_to?("gadzoks16"))
+ assert_equal(false, foo.respond_to?("gadzoks17", true))
+ end
+
def test_respond_to_missing
c = Class.new do
def respond_to_missing?(id, priv)
diff --git a/vm_method.c b/vm_method.c
index 927bbc10f1..d7d18cf4fa 100644
--- a/vm_method.c
+++ b/vm_method.c
@@ -1259,8 +1259,15 @@ obj_respond_to(int argc, VALUE *argv, VALUE obj)
ID id;
rb_scan_args(argc, argv, "11", &mid, &priv);
- if (!(id = rb_check_id(&mid)))
+ if (!(id = rb_check_id(&mid))) {
+ if (!rb_method_basic_definition_p(CLASS_OF(obj), respond_to_missing)) {
+ VALUE args[2];
+ args[0] = ID2SYM(rb_to_id(mid));
+ args[1] = priv;
+ return rb_funcall2(obj, respond_to_missing, 2, args);
+ }
return Qfalse;
+ }
if (basic_obj_respond_to(obj, id, !RTEST(priv)))
return Qtrue;
return Qfalse;