diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-11-26 20:22:12 -0800 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-11-26 20:22:12 -0800 |
| commit | 2ea245db3dd439cf179bbe120177ddcd086e4707 (patch) | |
| tree | 437e160870f1a1e30af027dba9e89a6e7efdb782 | |
| parent | d03bd87dc0213954f1f15c24507b38d1820192eb (diff) | |
| parent | 1f3c5125648e10ac5d9dc90be66025b4741fa24d (diff) | |
| download | mruby-2ea245db3dd439cf179bbe120177ddcd086e4707.tar.gz mruby-2ea245db3dd439cf179bbe120177ddcd086e4707.zip | |
Merge pull request #572 from skandhas/pr-add-Module-instance_methods
add "Module#instance_methods" for mruby
| -rw-r--r-- | src/class.c | 42 | ||||
| -rw-r--r-- | src/kernel.c | 2 | ||||
| -rw-r--r-- | test/t/module.rb | 20 |
3 files changed, 63 insertions, 1 deletions
diff --git a/src/class.c b/src/class.c index ed1b0cd25..69aa31249 100644 --- a/src/class.c +++ b/src/class.c @@ -807,6 +807,47 @@ mrb_mod_included_modules(mrb_state *mrb, mrb_value self) return result; } +mrb_value class_instance_method_list(mrb_state*, int, mrb_value*, struct RClass*, int); + +/* 15.2.2.4.33 */ +/* + * call-seq: + * mod.instance_methods(include_super=true) -> array + * + * Returns an array containing the names of the public and protected instance + * methods in the receiver. For a module, these are the public and protected methods; + * for a class, they are the instance (not singleton) methods. With no + * argument, or with an argument that is <code>false</code>, the + * instance methods in <i>mod</i> are returned, otherwise the methods + * in <i>mod</i> and <i>mod</i>'s superclasses are returned. + * + * module A + * def method1() end + * end + * class B + * def method2() end + * end + * class C < B + * def method3() end + * end + * + * A.instance_methods #=> [:method1] + * B.instance_methods(false) #=> [:method2] + * C.instance_methods(false) #=> [:method3] + * C.instance_methods(true).length #=> 43 + */ + +static mrb_value +mrb_mod_instance_methods(mrb_state *mrb, mrb_value mod) +{ + mrb_value *argv; + int argc; + struct RClass *c = mrb_class_ptr(mod); + + mrb_get_args(mrb, "*", &argv, &argc); + return class_instance_method_list(mrb, argc, argv, c, 0); +} + mrb_value mrb_singleton_class(mrb_state *mrb, mrb_value v) { @@ -1465,6 +1506,7 @@ mrb_init_class(mrb_state *mrb) 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 */ + mrb_define_method(mrb, mod, "instance_methods", mrb_mod_instance_methods, ARGS_ANY()); /* 15.2.2.4.33 */ mrb_define_method(mrb, mod, "to_s", mrb_mod_to_s, ARGS_NONE()); mrb_define_method(mrb, mod, "inspect", mrb_mod_to_s, ARGS_NONE()); diff --git a/src/kernel.c b/src/kernel.c index 5fcebc4a9..531c6d9d8 100644 --- a/src/kernel.c +++ b/src/kernel.c @@ -717,7 +717,7 @@ method_entry_loop(mrb_state *mrb, struct RClass* klass, mrb_value ary) } } -static mrb_value +mrb_value class_instance_method_list(mrb_state *mrb, int argc, mrb_value *argv, struct RClass* klass, int obj) { mrb_value ary; diff --git a/test/t/module.rb b/test/t/module.rb index 96bded1ee..e666a1763 100644 --- a/test/t/module.rb +++ b/test/t/module.rb @@ -132,6 +132,26 @@ assert('Module#included_modules', '15.2.2.4.30') do r.class == Array and r.include?(Test4includedModules) end +assert('Module#instance_methods', '15.2.2.4.33') do + module Test4InstanceMethodsA + def method1() end + end + class Test4InstanceMethodsB + def method2() end + end + class Test4InstanceMethodsC < Test4InstanceMethodsB + def method3() end + end + + r = Test4InstanceMethodsC.instance_methods(true) + + Test4InstanceMethodsA.instance_methods == [:method1] and + Test4InstanceMethodsB.instance_methods(false) == [:method2] and + Test4InstanceMethodsC.instance_methods(false) == [:method3] and + r.class == Array and r.include?(:method3) and r.include?(:method2) +end + + # Not ISO specified assert('Module#to_s') do |
