diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-08-20 00:03:30 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2016-08-20 00:03:30 +0900 |
| commit | ff3e4b91f282ade0c205b72e18c08ca22acdcdf8 (patch) | |
| tree | b314d821bbb0c9449863619352e19ddce761a471 | |
| parent | b2fceae461c8c266136cd881ce7969a05061cada (diff) | |
| download | mruby-ff3e4b91f282ade0c205b72e18c08ca22acdcdf8.tar.gz mruby-ff3e4b91f282ade0c205b72e18c08ca22acdcdf8.zip | |
Move Module#include and #prepend to class.c; ref #3197
To avoid VM nesting with mrb_funcall()
| -rw-r--r-- | mrblib/00class.rb | 15 | ||||
| -rw-r--r-- | src/class.c | 38 |
2 files changed, 15 insertions, 38 deletions
diff --git a/mrblib/00class.rb b/mrblib/00class.rb index 39e0d5091..f3762e8d0 100644 --- a/mrblib/00class.rb +++ b/mrblib/00class.rb @@ -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 diff --git a/src/class.c b/src/class.c index 0f72c7753..47a6c846b 100644 --- a/src/class.c +++ b/src/class.c @@ -948,24 +948,6 @@ mrb_mod_prepend_features(mrb_state *mrb, mrb_value 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) { mrb_value klass; @@ -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 */ |
