From 940eb786e4bfcd747480b2d3bffe541b537fb3fd Mon Sep 17 00:00:00 2001 From: skandhas Date: Tue, 27 Nov 2012 15:48:33 +0800 Subject: add Module#module_eval --- src/class.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'src') diff --git a/src/class.c b/src/class.c index 69aa31249..8338287ba 100644 --- a/src/class.c +++ b/src/class.c @@ -848,6 +848,21 @@ mrb_mod_instance_methods(mrb_state *mrb, mrb_value mod) return class_instance_method_list(mrb, argc, argv, c, 0); } +mrb_value mrb_yield_internal(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_value self, struct RClass *c); + +mrb_value +mrb_mod_module_eval(mrb_state *mrb, mrb_value mod) +{ + mrb_value a, b; + struct RClass *c; + + if (mrb_get_args(mrb, "|S&", &a, &b) == 1) { + mrb_raise(mrb, E_NOTIMP_ERROR, "module_eval/class_eval with string not implemented"); + } + c = mrb_class_ptr(mod); + return mrb_yield_internal(mrb, b, 0, 0, mod, c); +} + mrb_value mrb_singleton_class(mrb_state *mrb, mrb_value v) { @@ -1507,6 +1522,7 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, mod, "included", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.29 */ mrb_define_method(mrb, mod, "included_modules", mrb_mod_included_modules, ARGS_NONE()); /* 15.2.2.4.30 */ mrb_define_method(mrb, mod, "instance_methods", mrb_mod_instance_methods, ARGS_ANY()); /* 15.2.2.4.33 */ + mrb_define_method(mrb, mod, "module_eval", mrb_mod_module_eval, ARGS_ANY()); /* 15.2.2.4.35 */ mrb_define_method(mrb, mod, "to_s", mrb_mod_to_s, ARGS_NONE()); mrb_define_method(mrb, mod, "inspect", mrb_mod_to_s, ARGS_NONE()); -- cgit v1.2.3 From 3fbeb298a6943c59567b0b3a8b8d50104858d8c1 Mon Sep 17 00:00:00 2001 From: skandhas Date: Tue, 27 Nov 2012 16:12:11 +0800 Subject: add comments for Module#module_eval --- src/class.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'src') diff --git a/src/class.c b/src/class.c index 8338287ba..981bf270e 100644 --- a/src/class.c +++ b/src/class.c @@ -850,6 +850,17 @@ mrb_mod_instance_methods(mrb_state *mrb, mrb_value mod) mrb_value mrb_yield_internal(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_value self, struct RClass *c); +/* 15.2.2.4.35 */ +/* + * call-seq: + * mod.class_eval {| | block } -> obj + * mod.module_eval {| | block } -> obj + * + * Evaluates block in the context of _mod_. This can + * be used to add methods to a class. module_eval returns + * the result of evaluating its argument. + */ + mrb_value mrb_mod_module_eval(mrb_state *mrb, mrb_value mod) { -- cgit v1.2.3 From 1311c828c687e5d192ed6a14d50bd1864faf8df9 Mon Sep 17 00:00:00 2001 From: skandhas Date: Tue, 27 Nov 2012 16:17:07 +0800 Subject: add Module#class_eval --- src/class.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/class.c b/src/class.c index 981bf270e..a5b028105 100644 --- a/src/class.c +++ b/src/class.c @@ -1530,7 +1530,8 @@ mrb_init_class(mrb_state *mrb) mrb_define_method(mrb, mod, "include", mrb_mod_include, ARGS_ANY()); /* 15.2.2.4.27 */ mrb_define_method(mrb, mod, "include?", mrb_mod_include_p, ARGS_REQ(1)); /* 15.2.2.4.28 */ mrb_define_method(mrb, mod, "append_features", mrb_mod_append_features, ARGS_REQ(1)); /* 15.2.2.4.10 */ - mrb_define_method(mrb, mod, "included", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.29 */ + mrb_define_method(mrb, mod, "class_eval", mrb_mod_module_eval, ARGS_ANY()); /* 15.2.2.4.15 */ + mrb_define_method(mrb, mod, "included", mrb_bob_init, ARGS_REQ(1)); /* 15.2.2.4.29 */ mrb_define_method(mrb, mod, "included_modules", mrb_mod_included_modules, ARGS_NONE()); /* 15.2.2.4.30 */ mrb_define_method(mrb, mod, "instance_methods", mrb_mod_instance_methods, ARGS_ANY()); /* 15.2.2.4.33 */ mrb_define_method(mrb, mod, "module_eval", mrb_mod_module_eval, ARGS_ANY()); /* 15.2.2.4.35 */ -- cgit v1.2.3