diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-11-25 06:31:42 -0800 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-11-25 06:31:42 -0800 |
| commit | d03bd87dc0213954f1f15c24507b38d1820192eb (patch) | |
| tree | fc0e193f6f0ee56cc9e5d0a9853a41346e39ac63 /src/class.c | |
| parent | 32bacb21a2d51e9466b54bc5e30a832e68077c78 (diff) | |
| parent | 25a02a5b8b7954fa197d42d208ee257a4a8d9c96 (diff) | |
| download | mruby-d03bd87dc0213954f1f15c24507b38d1820192eb.tar.gz mruby-d03bd87dc0213954f1f15c24507b38d1820192eb.zip | |
Merge pull request #571 from skandhas/pr-add-Module-include-p
add "Module#include?" for mruby
Diffstat (limited to 'src/class.c')
| -rw-r--r-- | src/class.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/class.c b/src/class.c index fe2baa4f2..ed1b0cd25 100644 --- a/src/class.c +++ b/src/class.c @@ -722,6 +722,43 @@ 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 <code>true</code> if <i>module</i> is included in + * <i>mod</i> or one of <i>mod</i>'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) +{ + 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 +1461,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 */ |
