From 54e1ed20f95fad747be5d0b15c81cd9a1ce20a9e Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Sat, 20 Apr 2013 07:47:58 -0400 Subject: Add a test for respond_to_missing? --- test/t/kernel.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/t/kernel.rb b/test/t/kernel.rb index abc8f260b..f2f387bb2 100644 --- a/test/t/kernel.rb +++ b/test/t/kernel.rb @@ -392,3 +392,16 @@ assert('Kernel#!=') do (str1 != str3) == true and (str2 != str1) == false end + +assert('Kernel#respond_to_missing?') do + + class Test4RespondToMissing + def respond_to_missing?(method_name, include_private = false) + method_name == :a_method + end + end + + Test4RespondToMissing.new.respond_to?(:a_method) == true and + Test4RespondToMissing.new.respond_to?(:no_method) == false + +end -- cgit v1.2.3 From 93b23357fe34e3a0534f92315fcb649d945d7e08 Mon Sep 17 00:00:00 2001 From: Carson McDonald Date: Sat, 20 Apr 2013 07:48:26 -0400 Subject: Add implementation for respond_to_missing? --- src/kernel.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/kernel.c b/src/kernel.c index 739f9b73f..b450d68ff 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -965,7 +965,7 @@ obj_respond_to(mrb_state *mrb, mrb_value self) mrb_value *argv; int argc; mrb_value mid, priv; - mrb_sym id; + mrb_sym id, rtm_id; mrb_bool respond_to_p; mrb_get_args(mrb, "*", &argv, &argc); @@ -976,6 +976,13 @@ obj_respond_to(mrb_state *mrb, mrb_value self) respond_to_p = basic_obj_respond_to(mrb, self, id, !mrb_test(priv)); + if(!respond_to_p) { + rtm_id = mrb_intern2(mrb, "respond_to_missing?", 19); + if(basic_obj_respond_to(mrb, self, rtm_id, !mrb_test(priv))) { + return mrb_funcall_argv(mrb, self, rtm_id, argc, argv); + } + } + return mrb_bool_value(respond_to_p); } -- cgit v1.2.3