Project

General

Profile

Actions

Bug #16100

closed

Visibility modifiers don't call super correctly when overridden in alternative ways

Added by prebsch (Patrick Rebsch) over 4 years ago. Updated over 4 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.7.0dev (2019-08-14) [x86_64-darwin18]
[ruby-core:94335]

Description

It seems that the method visibility modifiers don't call super correctly when they are overridden in certain ways. I expected the following examples to all behave the same since they are all being defined on the singleton class, but only the first operates correctly presumably because it is explicitly defined on the singleton class. I've reproduced this behavior with 2.7.0, 2.6.3, and 2.5.5.

def test_visibility(description, klass)
  puts "Case: #{ description }"
  puts "  #=> #{ klass.private_instance_methods.include?(:private_method) }"
  puts
end

test_visibility('explicit', Class.new {
  def self.private(*); super; end
  private; def private_method; end
})

test_visibility('opened singleton', Class.new {
  class << self
    def private(*); super; end
  end
  private; def private_method; end
})

test_visibility('include/prepend to singleton', Class.new {
  module M
    def private(*); super; end
  end
  singleton_class.prepend(M)
  private; def private_method; end
})
Case: explicit
  #=> true

Case: opened singleton
  #=> false

Case: include/prepend to singleton
  #=> false
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0