mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Move Module#include and #prepend to class.c; ref #3197
To avoid VM nesting with mrb_funcall()
This commit is contained in:
@@ -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
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user