* [ruby-core:84539] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection
[not found] <redmine.issue-14252.20171228013205@ruby-lang.org>
@ 2017-12-28 1:32 ` michaud.sonny
2017-12-28 2:28 ` [ruby-core:84540] " shugo
` (3 subsequent siblings)
4 siblings, 0 replies; 5+ messages in thread
From: michaud.sonny @ 2017-12-28 1:32 UTC (permalink / raw
To: ruby-core
Issue #14252 has been reported by sonnym (Sonny Michaud).
----------------------------------------
Bug #14252: Refined Method Visibility Lost with Dynamic Dispatch and Reflection
https://bugs.ruby-lang.org/issues/14252
* Author: sonnym (Sonny Michaud)
* Status: Open
* Priority: Normal
* Assignee:
* Target version:
* ruby -v: ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
Consider the following simple objects, one with a protected class method and another with a public class method calling on the protected method. This is accomplished using a refinement that marks the method as public on the singleton class of the original object.
~~~ ruby
class Protected
class << self
protected
def print
:protected
end
end
end
module Publicize
refine Protected.singleton_class do
public :print
end
end
class Public
using Publicize
def self.print
Protected.public_methods.include?(:print) # false
Protected.protected_methods.include?(:print) # true
Protected.print # works
Protected.public_send(:print) # fails
end
end
Public.print
~~~
This works perfectly well for the static `Protected.print` call, but has a number of surprises when trying to do anything more advanced. Namely:
* Attempting to call the method with refined visibility raises a `NoMethodError`
* The method appears in the `protected_methods` list of the original object
* The method does not appear in the `public_methods` list of the original object
As a user, I would expect all those things to be not the case, since, if I opened the class directly and changed the visibility of the method, those three items would no longer be true.
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 5+ messages in thread
* [ruby-core:84540] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection
[not found] <redmine.issue-14252.20171228013205@ruby-lang.org>
2017-12-28 1:32 ` [ruby-core:84539] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection michaud.sonny
@ 2017-12-28 2:28 ` shugo
2017-12-28 3:05 ` [ruby-core:84544] " michaud.sonny
` (2 subsequent siblings)
4 siblings, 0 replies; 5+ messages in thread
From: shugo @ 2017-12-28 2:28 UTC (permalink / raw
To: ruby-core
Issue #14252 has been updated by shugo (Shugo Maeda).
sonnym (Sonny Michaud) wrote:
> This works perfectly well for the static `Protected.print` call, but has a number of surprises when trying to do anything more advanced. Namely:
>
> * Attempting to call the method with refined visibility raises a `NoMethodError`
> * The method appears in the `protected_methods` list of the original object
> * The method does not appear in the `public_methods` list of the original object
Reflection APIs do not honor refinements.
If you believe they should, please create a feature ticket for each API family.
Refinements were enabled in Kernel#send by #11476, so it may be reasonable to
enable refinements in Kernel#public_send.
----------------------------------------
Bug #14252: Refined Method Visibility Lost with Dynamic Dispatch and Reflection
https://bugs.ruby-lang.org/issues/14252#change-69068
* Author: sonnym (Sonny Michaud)
* Status: Open
* Priority: Normal
* Assignee:
* Target version:
* ruby -v: ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
Consider the following simple objects, one with a protected class method and another with a public class method calling on the protected method. This is accomplished using a refinement that marks the method as public on the singleton class of the original object.
~~~ ruby
class Protected
class << self
protected
def print
:protected
end
end
end
module Publicize
refine Protected.singleton_class do
public :print
end
end
class Public
using Publicize
def self.print
Protected.public_methods.include?(:print) # false
Protected.protected_methods.include?(:print) # true
Protected.print # works
Protected.public_send(:print) # fails
end
end
Public.print
~~~
This works perfectly well for the static `Protected.print` call, but has a number of surprises when trying to do anything more advanced. Namely:
* Attempting to call the method with refined visibility raises a `NoMethodError`
* The method appears in the `protected_methods` list of the original object
* The method does not appear in the `public_methods` list of the original object
As a user, I would expect all those things to be not the case, since, if I opened the class directly and changed the visibility of the method, those three items would no longer be true.
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 5+ messages in thread
* [ruby-core:84544] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection
[not found] <redmine.issue-14252.20171228013205@ruby-lang.org>
2017-12-28 1:32 ` [ruby-core:84539] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection michaud.sonny
2017-12-28 2:28 ` [ruby-core:84540] " shugo
@ 2017-12-28 3:05 ` michaud.sonny
2018-01-04 3:25 ` [ruby-core:84624] " michaud.sonny
2019-06-21 16:37 ` [ruby-core:93302] " merch-redmine
4 siblings, 0 replies; 5+ messages in thread
From: michaud.sonny @ 2017-12-28 3:05 UTC (permalink / raw
To: ruby-core
Issue #14252 has been updated by sonnym (Sonny Michaud).
I, personally, do not care so much about the reflection APIs, as I was just using them to confirm what I thought was happening, but I would like to at least see `Kernel#public_send` act similarly to `Kernel#send`, so I think it makes sense to scope this issue to that change.
----------------------------------------
Bug #14252: Refined Method Visibility Lost with Dynamic Dispatch and Reflection
https://bugs.ruby-lang.org/issues/14252#change-69071
* Author: sonnym (Sonny Michaud)
* Status: Open
* Priority: Normal
* Assignee:
* Target version:
* ruby -v: ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
Consider the following simple objects, one with a protected class method and another with a public class method calling on the protected method. This is accomplished using a refinement that marks the method as public on the singleton class of the original object.
~~~ ruby
class Protected
class << self
protected
def print
:protected
end
end
end
module Publicize
refine Protected.singleton_class do
public :print
end
end
class Public
using Publicize
def self.print
Protected.public_methods.include?(:print) # false
Protected.protected_methods.include?(:print) # true
Protected.print # works
Protected.public_send(:print) # fails
end
end
Public.print
~~~
This works perfectly well for the static `Protected.print` call, but has a number of surprises when trying to do anything more advanced. Namely:
* Attempting to call the method with refined visibility raises a `NoMethodError`
* The method appears in the `protected_methods` list of the original object
* The method does not appear in the `public_methods` list of the original object
As a user, I would expect all those things to be not the case, since, if I opened the class directly and changed the visibility of the method, those three items would no longer be true.
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 5+ messages in thread
* [ruby-core:84624] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection
[not found] <redmine.issue-14252.20171228013205@ruby-lang.org>
` (2 preceding siblings ...)
2017-12-28 3:05 ` [ruby-core:84544] " michaud.sonny
@ 2018-01-04 3:25 ` michaud.sonny
2019-06-21 16:37 ` [ruby-core:93302] " merch-redmine
4 siblings, 0 replies; 5+ messages in thread
From: michaud.sonny @ 2018-01-04 3:25 UTC (permalink / raw
To: ruby-core
Issue #14252 has been updated by sonnym (Sonny Michaud).
I wrote an article explaining what I was trying to accomplish when I encountered this behavior, in case that helps elucidate my motivations: https://sonnym.github.io/2018/01/03/privacy-and-exposure-gatekeeprs-and-privileged-consumers/
----------------------------------------
Bug #14252: Refined Method Visibility Lost with Dynamic Dispatch and Reflection
https://bugs.ruby-lang.org/issues/14252#change-69168
* Author: sonnym (Sonny Michaud)
* Status: Open
* Priority: Normal
* Assignee:
* Target version:
* ruby -v: ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
Consider the following simple objects, one with a protected class method and another with a public class method calling on the protected method. This is accomplished using a refinement that marks the method as public on the singleton class of the original object.
~~~ ruby
class Protected
class << self
protected
def print
:protected
end
end
end
module Publicize
refine Protected.singleton_class do
public :print
end
end
class Public
using Publicize
def self.print
Protected.public_methods.include?(:print) # false
Protected.protected_methods.include?(:print) # true
Protected.print # works
Protected.public_send(:print) # fails
end
end
Public.print
~~~
This works perfectly well for the static `Protected.print` call, but has a number of surprises when trying to do anything more advanced. Namely:
* Attempting to call the method with refined visibility raises a `NoMethodError`
* The method appears in the `protected_methods` list of the original object
* The method does not appear in the `public_methods` list of the original object
As a user, I would expect all those things to be not the case, since, if I opened the class directly and changed the visibility of the method, those three items would no longer be true.
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 5+ messages in thread
* [ruby-core:93302] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection
[not found] <redmine.issue-14252.20171228013205@ruby-lang.org>
` (3 preceding siblings ...)
2018-01-04 3:25 ` [ruby-core:84624] " michaud.sonny
@ 2019-06-21 16:37 ` merch-redmine
4 siblings, 0 replies; 5+ messages in thread
From: merch-redmine @ 2019-06-21 16:37 UTC (permalink / raw
To: ruby-core
Issue #14252 has been updated by jeremyevans0 (Jeremy Evans).
Status changed from Open to Closed
Ruby 2.6.0 started honoring refinements in `Kernel#public_send`.
----------------------------------------
Bug #14252: Refined Method Visibility Lost with Dynamic Dispatch and Reflection
https://bugs.ruby-lang.org/issues/14252#change-78774
* Author: sonnym (Sonny Michaud)
* Status: Closed
* Priority: Normal
* Assignee:
* Target version:
* ruby -v: ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
Consider the following simple objects, one with a protected class method and another with a public class method calling on the protected method. This is accomplished using a refinement that marks the method as public on the singleton class of the original object.
~~~ ruby
class Protected
class << self
protected
def print
:protected
end
end
end
module Publicize
refine Protected.singleton_class do
public :print
end
end
class Public
using Publicize
def self.print
Protected.public_methods.include?(:print) # false
Protected.protected_methods.include?(:print) # true
Protected.print # works
Protected.public_send(:print) # fails
end
end
Public.print
~~~
This works perfectly well for the static `Protected.print` call, but has a number of surprises when trying to do anything more advanced. Namely:
* Attempting to call the method with refined visibility raises a `NoMethodError`
* The method appears in the `protected_methods` list of the original object
* The method does not appear in the `public_methods` list of the original object
As a user, I would expect all those things to be not the case, since, if I opened the class directly and changed the visibility of the method, those three items would no longer be true.
--
https://bugs.ruby-lang.org/
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2019-06-21 16:38 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <redmine.issue-14252.20171228013205@ruby-lang.org>
2017-12-28 1:32 ` [ruby-core:84539] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection michaud.sonny
2017-12-28 2:28 ` [ruby-core:84540] " shugo
2017-12-28 3:05 ` [ruby-core:84544] " michaud.sonny
2018-01-04 3:25 ` [ruby-core:84624] " michaud.sonny
2019-06-21 16:37 ` [ruby-core:93302] " merch-redmine
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).