diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-05-20 16:22:11 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-05-20 16:22:11 +0900 |
| commit | 929328ad3bfc3f7b0e5d01b707098a93038f3413 (patch) | |
| tree | d08842412d846641986d74b1637393bd12a3f272 | |
| parent | 3cbae5354149d311f6740c99474a96f4d1d8bca1 (diff) | |
| parent | c4a225f0be7281ed2d303c908aed2c327b37a572 (diff) | |
| download | mruby-929328ad3bfc3f7b0e5d01b707098a93038f3413.tar.gz mruby-929328ad3bfc3f7b0e5d01b707098a93038f3413.zip | |
Merge pull request #2295 from ksss/module-initialize
Implement Module#initialize (15.2.2.4.31)
| -rw-r--r-- | src/class.c | 15 | ||||
| -rw-r--r-- | test/t/module.rb | 6 |
2 files changed, 20 insertions, 1 deletions
diff --git a/src/class.c b/src/class.c index dd7bc4fea..852c88757 100644 --- a/src/class.c +++ b/src/class.c @@ -741,7 +741,7 @@ mrb_include_module(mrb_state *mrb, struct RClass *c, struct RClass *m) struct RClass *p = c, *ic; int superclass_seen = 0; - if (c->mt == m->mt) { + if (c->mt && c->mt == m->mt) { mrb_raise(mrb, E_ARGUMENT_ERROR, "cyclic include detected"); } while (p) { @@ -890,6 +890,18 @@ mrb_mod_included_modules(mrb_state *mrb, mrb_value self) return result; } +static mrb_value +mrb_mod_initialize(mrb_state *mrb, mrb_value mod) +{ + mrb_value b; + + mrb_get_args(mrb, "&", &b); + if (!mrb_nil_p(b)) { + mrb_yield_with_class(mrb, b, 0, 0, mod, mrb_class_ptr(mod)); + } + return mod; +} + mrb_value mrb_class_instance_method_list(mrb_state*, mrb_bool, struct RClass*, int); /* 15.2.2.4.33 */ @@ -1989,6 +2001,7 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, mod, "class_eval", mrb_mod_module_eval, MRB_ARGS_ANY()); /* 15.2.2.4.15 */ mrb_define_method(mrb, mod, "included", mrb_bob_init, MRB_ARGS_REQ(1)); /* 15.2.2.4.29 */ mrb_define_method(mrb, mod, "included_modules", mrb_mod_included_modules, MRB_ARGS_NONE()); /* 15.2.2.4.30 */ + mrb_define_method(mrb, mod, "initialize", mrb_mod_initialize, MRB_ARGS_NONE()); /* 15.2.2.4.31 */ mrb_define_method(mrb, mod, "instance_methods", mrb_mod_instance_methods, MRB_ARGS_ANY()); /* 15.2.2.4.33 */ mrb_define_method(mrb, mod, "method_defined?", mrb_mod_method_defined, MRB_ARGS_REQ(1)); /* 15.2.2.4.34 */ mrb_define_method(mrb, mod, "module_eval", mrb_mod_module_eval, MRB_ARGS_ANY()); /* 15.2.2.4.35 */ diff --git a/test/t/module.rb b/test/t/module.rb index 2072f1f3c..806824b70 100644 --- a/test/t/module.rb +++ b/test/t/module.rb @@ -340,6 +340,12 @@ assert('Module#included_modules', '15.2.2.4.30') do assert_true r.include?(Test4includedModules) end +assert('Module#initialize', '15.2.2.4.31') do + assert_kind_of Module, Module.new + mod = Module.new { def hello; "hello"; end } + assert_equal [:hello], mod.instance_methods +end + assert('Module#instance_methods', '15.2.2.4.33') do module Test4InstanceMethodsA def method1() end |
