Actions
Bug #21446
openStackOverflow when changing visibility in reopened refinement
Bug #21446:
StackOverflow when changing visibility in reopened refinement
Description
class A
def a
:a
end
end
class B < A
end
module R
refine B do
private :a
end
end
module R
refine B do
public :a
end
end
using R
B.new.a # StackOverflow
I would expect it to change the visibility, not to overflow the stack.
Updated by nobu (Nobuyoshi Nakada) 4 months ago
It does not seem to need to reopen the refinement.
Reproduces just by changing visibility twice.
module R
refine B do
private :a
public :a
end
end
Updated by nobu (Nobuyoshi Nakada) 4 months ago
- Backport changed from 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN to 3.2: REQUIRED, 3.3: REQUIRED, 3.4: REQUIRED
Updated by jeremyevans0 (Jeremy Evans) 9 days ago
I found that you don't even need to change the visibility twice. This issue affects all refinement visibility change methods where the method whose visibility is changed by the refinement is in an ancestor of the refined class. Here's a simplified example:
class A
private def a
:a
end
end
class B < A
end
module R
refine B do
public :a
end
end
using R
p B.new.a
I've submitted a pull request that handles this case: https://github.com/ruby/ruby/pull/14817
Actions