Move Module#include and #prepend to class.c; ref #3197

To avoid VM nesting with mrb_funcall()
This commit is contained in:
Yukihiro "Matz" Matsumoto
2016-08-20 00:03:30 +09:00
parent b2fceae461
commit ff3e4b91f2
2 changed files with 15 additions and 38 deletions
+15
View File
@@ -8,4 +8,19 @@ class Module
def attr(name)
attr_reader(name)
end
# 15.2.2.4.27
def include(*args)
args.reverse.each do |m|
m.append_features(self)
m.included(self)
end
end
def prepend(*args)
args.reverse.each do |m|
m.prepend_features(self)
m.prepended(self)
end
end
end
-38
View File
@@ -947,24 +947,6 @@ mrb_mod_prepend_features(mrb_state *mrb, mrb_value mod)
return mod;
}
static mrb_value
mrb_mod_prepend(mrb_state *mrb, mrb_value klass)
{
mrb_value *argv;
mrb_int argc, i;
mrb_get_args(mrb, "*", &argv, &argc);
for (i=0; i<argc; i++) {
mrb_check_type(mrb, argv[i], MRB_TT_MODULE);
}
while (argc--) {
mrb_funcall(mrb, argv[argc], "prepend_features", 1, klass);
mrb_funcall(mrb, argv[argc], "prepended", 1, klass);
}
return klass;
}
static mrb_value
mrb_mod_append_features(mrb_state *mrb, mrb_value mod)
{
@@ -976,24 +958,6 @@ mrb_mod_append_features(mrb_state *mrb, mrb_value mod)
return mod;
}
static mrb_value
mrb_mod_include(mrb_state *mrb, mrb_value klass)
{
mrb_value *argv;
mrb_int argc, i;
mrb_get_args(mrb, "*", &argv, &argc);
for (i=0; i<argc; i++) {
mrb_check_type(mrb, argv[i], MRB_TT_MODULE);
}
while (argc--) {
mrb_funcall(mrb, argv[argc], "append_features", 1, klass);
mrb_funcall(mrb, argv[argc], "included", 1, klass);
}
return klass;
}
/* 15.2.2.4.28 */
/*
* call-seq:
@@ -2247,10 +2211,8 @@ mrb_init_class(mrb_state *mrb)
mrb_define_method(mrb, mod, "class_variable_set", mrb_mod_cvar_set, MRB_ARGS_REQ(2)); /* 15.2.2.4.18 */
mrb_define_method(mrb, mod, "extend_object", mrb_mod_extend_object, MRB_ARGS_REQ(1)); /* 15.2.2.4.25 */
mrb_define_method(mrb, mod, "extended", mrb_bob_init, MRB_ARGS_REQ(1)); /* 15.2.2.4.26 */
mrb_define_method(mrb, mod, "prepend", mrb_mod_prepend, MRB_ARGS_ANY());
mrb_define_method(mrb, mod, "prepended", mrb_bob_init, MRB_ARGS_REQ(1));
mrb_define_method(mrb, mod, "prepend_features", mrb_mod_prepend_features, MRB_ARGS_REQ(1));
mrb_define_method(mrb, mod, "include", mrb_mod_include, MRB_ARGS_ANY()); /* 15.2.2.4.27 */
mrb_define_method(mrb, mod, "include?", mrb_mod_include_p, MRB_ARGS_REQ(1)); /* 15.2.2.4.28 */
mrb_define_method(mrb, mod, "append_features", mrb_mod_append_features, MRB_ARGS_REQ(1)); /* 15.2.2.4.10 */
mrb_define_method(mrb, mod, "class_eval", mrb_mod_module_eval, MRB_ARGS_ANY()); /* 15.2.2.4.15 */