Bug #9452
closedRefining methods that should be private
Description
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) almost 11 years ago
- Assignee set to shugo (Shugo Maeda)
Updated by shugo (Shugo Maeda) almost 11 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.
Updated by nagachika (Tomoyuki Chikanaga) almost 11 years ago
- Backport changed from 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN to 1.9.3: DONTNEED, 2.0.0: REQUIRED, 2.1: REQUIRED
Updated by nagachika (Tomoyuki Chikanaga) almost 11 years ago
- Backport changed from 1.9.3: DONTNEED, 2.0.0: REQUIRED, 2.1: REQUIRED to 1.9.3: DONTNEED, 2.0.0: DONE, 2.1: REQUIRED
r44931 was backported to ruby_2_0_0 at r44967.
Updated by naruse (Yui NARUSE) almost 11 years ago
- Backport changed from 1.9.3: DONTNEED, 2.0.0: DONE, 2.1: REQUIRED to 1.9.3: DONTNEED, 2.0.0: DONE, 2.1: DONE
r45107.