From ca20017ac966d640c902a0f5d43c5dcd579ee05c Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 7 Feb 2025 02:24:15 +0900 Subject: [PATCH] class.c: implement mrb_define_private_method() --- include/mruby.h | 3 +++ src/class.c | 25 +++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/include/mruby.h b/include/mruby.h index 7cba1aef9..ad187a58b 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -424,8 +424,11 @@ MRB_API void mrb_prepend_module(mrb_state *mrb, struct RClass *cla, struct RClas * @param func The function pointer to the method definition. * @param aspec The method parameters declaration. */ + MRB_API void mrb_define_method(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t func, mrb_aspec aspec); MRB_API void mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec); +MRB_API void mrb_define_private_method(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t func, mrb_aspec aspec); +MRB_API void mrb_define_private_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec); /** * Defines a class method. diff --git a/src/class.c b/src/class.c index 9344eb539..c849eee92 100644 --- a/src/class.c +++ b/src/class.c @@ -786,8 +786,8 @@ mrb_define_method_raw(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_method_ mc_clear_by_id(mrb, mid); } -MRB_API void -mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec) +static void +define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec, int vis) { mrb_method_t m; int ai = mrb_gc_arena_save(mrb); @@ -796,16 +796,37 @@ mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t f if (aspec == MRB_ARGS_NONE()) { MRB_METHOD_NOARG_SET(m); } + if (vis) { + m.flags = (m.flags & ~0x3)|(vis & 0x3); + } mrb_define_method_raw(mrb, c, mid, m); mrb_gc_arena_restore(mrb, ai); } +MRB_API void +mrb_define_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec) +{ + define_method_id(mrb, c, mid, func, aspec, 0); +} + MRB_API void mrb_define_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, mrb_aspec aspec) { mrb_define_method_id(mrb, c, mrb_intern_cstr(mrb, name), func, aspec); } +MRB_API void +mrb_define_private_method_id(mrb_state *mrb, struct RClass *c, mrb_sym mid, mrb_func_t func, mrb_aspec aspec) +{ + define_method_id(mrb, c, mid, func, aspec, MT_PRIVATE); +} + +MRB_API void +mrb_define_private_method(mrb_state *mrb, struct RClass *c, const char *name, mrb_func_t func, mrb_aspec aspec) +{ + mrb_define_private_method_id(mrb, c, mrb_intern_cstr(mrb, name), func, aspec); +} + /* a function to raise NotImplementedError with current method name */ MRB_API void mrb_notimplement(mrb_state *mrb)