summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-04-20 06:44:04 -0700
committerYukihiro "Matz" Matsumoto <[email protected]>2013-04-20 06:44:04 -0700
commita70419bc4533133118fe8d6edf635b1e0e9bc084 (patch)
tree9a7011dd94025c7f2ac44f32b3916d0082266837
parentcc512dd8d0bd17fa6fba3dfc1b4046b4d4faf68b (diff)
parent93b23357fe34e3a0534f92315fcb649d945d7e08 (diff)
downloadmruby-a70419bc4533133118fe8d6edf635b1e0e9bc084.tar.gz
mruby-a70419bc4533133118fe8d6edf635b1e0e9bc084.zip
Merge pull request #1194 from carsonmcdonald/rtomissingimpl
Implement respond_to_missing?
-rw-r--r--src/kernel.c9
-rw-r--r--test/t/kernel.rb13
2 files changed, 21 insertions, 1 deletions
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);
}
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