From 59035eb33d5e1b276a1269a38f2cce421a528470 Mon Sep 17 00:00:00 2001 From: skandhas Date: Sat, 24 Nov 2012 16:04:11 +0800 Subject: add Module#include? --- src/class.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/class.c b/src/class.c index fe2baa4f2..3912dfe28 100644 --- a/src/class.c +++ b/src/class.c @@ -722,6 +722,24 @@ mrb_mod_include(mrb_state *mrb, mrb_value klass) return klass; } +static mrb_value +mrb_mod_include_p(mrb_state *mrb, mrb_value mod) +{ + mrb_value mod2; + struct RClass *c = mrb_class_ptr(mod); + + mrb_get_args(mrb, "o", &mod2); + mrb_check_type(mrb, mod2, MRB_TT_MODULE); + + while (c) { + if (c->tt == MRB_TT_ICLASS) { + if (c->c == mrb_class_ptr(mod2)) return mrb_true_value(); + } + c = c->super; + } + return mrb_false_value(); +} + static mrb_value mrb_mod_ancestors(mrb_state *mrb, mrb_value self) { @@ -1424,6 +1442,7 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, mod, "extend_object", mrb_mod_extend_object, ARGS_REQ(1)); /* 15.2.2.4.25 */ mrb_define_method(mrb, mod, "extended", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.26 */ mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_ANY()); /* 15.2.2.4.27 */ + mrb_define_method(mrb, mod, "include?", mrb_mod_include_p, ARGS_REQ(1)); /* 15.2.2.4.28 */ mrb_define_method(mrb, mod, "append_features", mrb_mod_append_features, ARGS_REQ(1)); /* 15.2.2.4.10 */ mrb_define_method(mrb, mod, "included", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.29 */ mrb_define_method(mrb, mod, "included_modules", mrb_mod_included_modules, ARGS_NONE()); /* 15.2.2.4.30 */ -- cgit v1.2.3 From cd8e9c14636fbef835328e50834d0baa41a0e0cf Mon Sep 17 00:00:00 2001 From: skandhas Date: Sat, 24 Nov 2012 16:21:37 +0800 Subject: add Module#include? test --- test/t/module.rb | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/t/module.rb b/test/t/module.rb index 511658150..96bded1ee 100644 --- a/test/t/module.rb +++ b/test/t/module.rb @@ -92,6 +92,20 @@ assert('Module#include', '15.2.2.4.27') do Test4Include2.const_get(:Const4Include) == 42 end +assert('Module#include?', '15.2.2.4.28') do + module Test4IncludeP + end + class Test4IncludeP2 + include Test4IncludeP + end + class Test4IncludeP3 < Test4IncludeP2 + end + + Test4IncludeP2.include?(Test4IncludeP) && + Test4IncludeP3.include?(Test4IncludeP) && + ! Test4IncludeP.include?(Test4IncludeP) +end + assert('Module#included', '15.2.2.4.29') do module Test4Included Const4Included = 42 -- cgit v1.2.3 From 25a02a5b8b7954fa197d42d208ee257a4a8d9c96 Mon Sep 17 00:00:00 2001 From: skandhas Date: Sat, 24 Nov 2012 16:26:36 +0800 Subject: add comment for Module#include? --- src/class.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/class.c b/src/class.c index 3912dfe28..ed1b0cd25 100644 --- a/src/class.c +++ b/src/class.c @@ -722,6 +722,25 @@ mrb_mod_include(mrb_state *mrb, mrb_value klass) return klass; } +/* 15.2.2.4.28 */ +/* + * call-seq: + * mod.include?(module) -> true or false + * + * Returns true if module is included in + * mod or one of mod's ancestors. + * + * module A + * end + * class B + * include A + * end + * class C < B + * end + * B.include?(A) #=> true + * C.include?(A) #=> true + * A.include?(A) #=> false + */ static mrb_value mrb_mod_include_p(mrb_state *mrb, mrb_value mod) { -- cgit v1.2.3