Refining methods that should be private
Are refinements also meant to add private methods? This is what I tried:
module R refine Object do def m puts "Success!" end private(:m) end end using R m # success 42.m # success (= not private)
However, I can get near the desired functionality by defining a private method first:
class Object private def m end end module R refine Object do def m puts "Success!" end end end using R m # success 42.m # no success (= it is private)
It calls the right code. But requires global core ext.
Updated by shugo (Shugo Maeda) about 6 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
Applied in changeset r44931.
vm_insnhelper.c (vm_call_method): should check ci->me->flag of
a refining method in case the method is private.
[ruby-core:60111] [Bug #9452]
vm_method.c (make_method_entry_refined): set me->flag of a refined
method entry to NOEX_PUBLIC in case the original method is private
and it is refined as a public method. The original flag is stored
in me->def->body.orig_me, so it's OK to make a refined method
entry public. [ruby-core:60111] [Bug #9452]
test/ruby/test_refinement.rb: related tests.