Project

General

Profile

Actions

Bug #12782

closed

Forwardable breaks on private methods in ruby 2.4

Added by jeremyevans0 (Jeremy Evans) over 7 years ago. Updated over 7 years ago.

Status:
Closed
Target version:
-
ruby -v:
ruby 2.4.0preview2 (2016-09-09 trunk 56129) [i386-openbsd]
[ruby-core:77341]

Description

Due to an optimization in r55376, attempting to forward to private methods no longer works in ruby 2.4. Among other things, this breaks haml template support in tilt. Example:

require 'forwardable'
class Foo
  private def foo; :foo end
  extend Forwardable
  def_delegator :itself, :foo, :bar
end
p Foo.new.bar

On ruby 2.3, this outputs :foo, on 2.4.0preview2 it raises NoMethodError. I think r55376 should be reverted, as the optimization it uses does not appear to be able to handle private method calls.

Updated by nobu (Nobuyoshi Nakada) over 7 years ago

I suspect that it was a bug to able to delegate a private method.

Updated by jeremyevans0 (Jeremy Evans) over 7 years ago

  • Assignee set to matz (Yukihiro Matsumoto)

Nobuyoshi Nakada wrote:

I suspect that it was a bug to able to delegate a private method.

It does seem like a bad idea to allow forwarding to private methods. However, the commit message did not mention that it fixes a bug, so I believe the behavior change was unintentional. Allowing delegating to private methods dates to forwardable's initial commit (in ruby 1.6), and there are ruby libraries relying on this behavior (tilt's haml support at least). Assigning to matz to make a decision on whether to break backwards compatibility.

Updated by marcandre (Marc-Andre Lafortune) over 7 years ago

The choice might be more between simply reverting and reverting but adding code to detect private calls and issue a deprecation warning so we can reintroduce the optimization in another version.

Actions #4

Updated by nobu (Nobuyoshi Nakada) over 7 years ago

  • Status changed from Open to Closed

Applied in changeset r56210.


forwardable.rb: private methods

  • lib/forwardable.rb (_delegator_method): allow private methods to
    be delegated, with warnings. [ruby-core:77341] [Bug #12782]
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0