From 84e1b0045c11e26cccaa648110baa1c229aebe30 Mon Sep 17 00:00:00 2001 From: dearblue Date: Mon, 7 Apr 2025 21:40:56 +0900 Subject: [PATCH] Fixed class method visibility via `module_function` The following code should work ```ruby module M def me p self end module_function :me end M.me ``` --- src/class.c | 2 +- test/t/module.rb | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/class.c b/src/class.c index 1c1986744..cf03a0197 100644 --- a/src/class.c +++ b/src/class.c @@ -2789,7 +2789,7 @@ mrb_mod_module_function(mrb_state *mrb, mrb_value mod) mrb_method_t m = mrb_method_search(mrb, rclass, mid); prepare_singleton_class(mrb, (struct RBasic*)rclass); - MRB_METHOD_SET_VISIBILITY(m, MT_PRIVATE); + MRB_METHOD_SET_VISIBILITY(m, MT_PUBLIC); mrb_define_method_raw(mrb, rclass->c, mid, m); mrb_gc_arena_restore(mrb, ai); } diff --git a/test/t/module.rb b/test/t/module.rb index dee47c814..1cfef87a3 100644 --- a/test/t/module.rb +++ b/test/t/module.rb @@ -838,6 +838,9 @@ assert('Module#module_function') do end assert_true M.respond_to?(:modfunc) + assert_equal nil do + M.modfunc + end end assert('module with non-class/module outer raises TypeError') do