[ruby-core:109595] [Ruby master Bug#18435] Calling `protected` on ancestor method changes result of `instance_methods(false)`
From:
"Eregon (Benoit Daloze)" <noreply@...>
Date:
2022-08-20 12:38:22 UTC
List:
ruby-core #109595
Issue #18435 has been updated by Eregon (Benoit Daloze).
FWIW, TruffleRuby and JRuby don't have ZSUPER methods, so it's like they always had the fix of https://github.com/ruby/ruby/pull/6242.
And so they could add correct {public?,protected?,private?} methods in 3.1 easily.
From that point of view it seems fairly safe to backport that PR (seems extremely unlikely to cause incompatibilities in practice).
Might still cause some confusion though if method/instance_method behavior changes between 3.1.2 and 3.1.3 for zsuper methods.
----------------------------------------
Bug #18435: Calling `protected` on ancestor method changes result of `instance_methods(false)`
https://bugs.ruby-lang.org/issues/18435#change-98777
* Author: ufuk (Ufuk Kayserilioglu)
* Status: Closed
* Priority: Normal
* Assignee: Eregon (Benoit Daloze)
* ruby -v: ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-darwin20]
* Backport: 2.6: DONTNEED, 2.7: DONTNEED, 3.0: DONTNEED, 3.1: REQUIRED
----------------------------------------
As documented `instance_methods(false)` works as follows:
```ruby
module A
def method1() end
end
class B
include A
def method2() end
end
p B.instance_methods(false) #=> [:method2]
```
However, calling `protected` on the method defined by `A`, unexpectedly changes the result of `instance_methods(false)` on `B`, even though the owner of the method is still `A`:
```ruby
module A
def method1() end
end
class B
include A
protected :method1
def method2() end
end
p B.instance_methods(false) #=> [:method1, :method2]
p B.instance_method(:method1).owner #=> A
```
In contrast, calling `private` or `public` on the same method does not cause any changes on the result of `B.instance_methods(false)`.
This feels like a bug in the implementation of `instance_methods(false)`, but, if it is by design, it should at least be documented on `Module#instance_methods`.
This reproduction script gives the same output all the way from Ruby 2.0 up to Ruby-HEAD:
https://wandbox.org/permlink/LqbXMBTYxURRZmDz
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>