From b2bfcabae2f5a5c567571508e210c58cccfc1f70 Mon Sep 17 00:00:00 2001 From: dearblue Date: Sat, 21 Nov 2020 22:31:13 +0900 Subject: Improved `Object#define_singleton_method` Integrate the implementation with `Module#define_method`. - Introduce the internal function `mrb_mod_define_method_m()` (no static) - The `Object#define_singleton_method` method can now accept a second argument --- mrbgems/mruby-metaprog/src/metaprog.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) (limited to 'mrbgems/mruby-metaprog') diff --git a/mrbgems/mruby-metaprog/src/metaprog.c b/mrbgems/mruby-metaprog/src/metaprog.c index 8bc9ab038..8afd85c86 100644 --- a/mrbgems/mruby-metaprog/src/metaprog.c +++ b/mrbgems/mruby-metaprog/src/metaprog.c @@ -401,21 +401,12 @@ mrb_obj_singleton_methods_m(mrb_state *mrb, mrb_value self) return mrb_obj_singleton_methods(mrb, recur, self); } +mrb_value mrb_mod_define_method_m(mrb_state *mrb, struct RClass *c); + static mrb_value mod_define_singleton_method(mrb_state *mrb, mrb_value self) { - struct RProc *p; - mrb_method_t m; - mrb_sym mid; - mrb_value blk = mrb_nil_value(); - - mrb_get_args(mrb, "n&!", &mid, &blk); - p = (struct RProc*)mrb_obj_alloc(mrb, MRB_TT_PROC, mrb->proc_class); - mrb_proc_copy(p, mrb_proc_ptr(blk)); - p->flags |= MRB_PROC_STRICT; - MRB_METHOD_FROM_PROC(m, p); - mrb_define_method_raw(mrb, mrb_class_ptr(mrb_singleton_class(mrb, self)), mid, m); - return mrb_symbol_value(mid); + return mrb_mod_define_method_m(mrb, mrb_class_ptr(mrb_singleton_class(mrb, self))); } static mrb_bool -- cgit v1.2.3