summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-05-20 16:22:11 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-05-20 16:22:11 +0900
commit929328ad3bfc3f7b0e5d01b707098a93038f3413 (patch)
treed08842412d846641986d74b1637393bd12a3f272 /src
parent3cbae5354149d311f6740c99474a96f4d1d8bca1 (diff)
parentc4a225f0be7281ed2d303c908aed2c327b37a572 (diff)
downloadmruby-929328ad3bfc3f7b0e5d01b707098a93038f3413.tar.gz
mruby-929328ad3bfc3f7b0e5d01b707098a93038f3413.zip
Merge pull request #2295 from ksss/module-initialize
Implement Module#initialize (15.2.2.4.31)
Diffstat (limited to 'src')
-rw-r--r--src/class.c15
1 files changed, 14 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 */