diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-07-26 16:05:30 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-07-26 16:05:30 +0000 |
commit | 298349d03bcdb6c25420d9a92265816d59892a1f (patch) | |
tree | efd250ee3f71d001f05d1d2ecb072cd05473f2c4 | |
parent | 3fbc65d47fe8d446dde8fe77d3b76fb81f8ffba1 (diff) | |
download | ruby-298349d03bcdb6c25420d9a92265816d59892a1f.tar.gz |
* 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-- | ChangeLog | 6 | ||||
-rw-r--r-- | test/ruby/test_object.rb | 13 | ||||
-rw-r--r-- | vm_method.c | 9 |
3 files changed, 26 insertions, 2 deletions
@@ -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; |