[#108461] [Ruby master Bug#18762] Add an Array#undigits that compliments Integer#digits — "shan (Shannon Skipper)" <noreply@...>

Issue #18762 has been reported by shan (Shannon Skipper).

8 messages 2022/05/02

[#108499] [Ruby master Bug#18767] IO.foreach hangs up when passes limit=0 — "andrykonchin (Andrew Konchin)" <noreply@...>

Issue #18767 has been reported by andrykonchin (Andrew Konchin).

9 messages 2022/05/10

[#108500] [Ruby master Bug#18768] Inconsistent behavior of IO, StringIO and String each_line methods when return paragraph and chomp: true passed — "andrykonchin (Andrew Konchin)" <noreply@...>

Issue #18768 has been reported by andrykonchin (Andrew Konchin).

7 messages 2022/05/10

[#108511] [Ruby master Feature#18773] deconstruct to receive a range — "kddeisz (Kevin Newton)" <noreply@...>

Issue #18773 has been reported by kddeisz (Kevin Newton).

12 messages 2022/05/11

[#108514] [Ruby master Feature#18774] Add Queue#pop(timeout:) — "Eregon (Benoit Daloze)" <noreply@...>

Issue #18774 has been reported by Eregon (Benoit Daloze).

17 messages 2022/05/11

[#108522] [Ruby master Feature#18776] Object Shapes — "jemmai (Jemma Issroff)" <noreply@...>

Issue #18776 has been reported by jemmai (Jemma Issroff).

25 messages 2022/05/11

[#108543] [Ruby master Bug#18779] `GC.compact` and other compaction related methods should be defined as rb_f_notimplement on non supported platforms. — "byroot (Jean Boussier)" <noreply@...>

Issue #18779 has been reported by byroot (Jean Boussier).

10 messages 2022/05/13

[#108546] [Ruby master Bug#18780] Incorrect binding receiver for C API rb_eval_string() — "daveola (David Stellar)" <noreply@...>

Issue #18780 has been reported by daveola (David Stellar).

21 messages 2022/05/13

[#108549] [Ruby master Bug#18781] MJIT tests failing with Ubuntu focal with gcc-11 and some flags — "jaruga (Jun Aruga)" <noreply@...>

Issue #18781 has been reported by jaruga (Jun Aruga).

8 messages 2022/05/14

[#108552] [Ruby master Bug#18782] Race conditions in autoload when loading the same feature with multiple threads. — "ioquatix (Samuel Williams)" <noreply@...>

Issue #18782 has been reported by ioquatix (Samuel Williams).

11 messages 2022/05/14

[#108565] [Ruby master Bug#18784] `FileUtils.rm_f` and `FileUtils.rm_rf` should not mask exceptions — deivid <noreply@...>

Issue #18784 has been reported by deivid (David Rodr鱈guez).

33 messages 2022/05/16

[#108590] [Ruby master Feature#18788] Support passing Regexp options as String to Regexp.new — janosch-x <noreply@...>

Issue #18788 has been reported by janosch-x (Janosch M端ller).

10 messages 2022/05/17

[#108659] [Ruby master Bug#18798] `UnboundMethod#==` with inherited classes — "ko1 (Koichi Sasada)" <noreply@...>

Issue #18798 has been reported by ko1 (Koichi Sasada).

16 messages 2022/05/24

[#108708] [Ruby master Bug#18808] Cannot compile ruby 3.1.2 on powerpc64le-linux without disabling the jit features — "npn (John Davis)" <noreply@...>

Issue #18808 has been reported by npn (John Davis).

17 messages 2022/05/26

[#108724] [Ruby master Feature#18809] Add Numeric#ceildiv — "kyanagi (Kouhei Yanagita)" <noreply@...>

Issue #18809 has been reported by kyanagi (Kouhei Yanagita).

9 messages 2022/05/27

[#108728] [Ruby master Bug#18810] Make `Kernel#p` interruptable. — "ioquatix (Samuel Williams)" <noreply@...>

Issue #18810 has been reported by ioquatix (Samuel Williams).

13 messages 2022/05/28

[ruby-core:108740] [Ruby master Bug#18806] protected methods defined by refinements can't be called

From: "jhawthorn (John Hawthorn)" <noreply@...>
Date: 2022-05-30 18:36:29 UTC
List: ruby-core #108740
Issue #18806 has been updated by jhawthorn (John Hawthorn).


Patch implementing option 1: https://github.com/ruby/ruby/pull/5966

----------------------------------------
Bug #18806: protected methods defined by refinements can't be called
https://bugs.ruby-lang.org/issues/18806#change-97798

* Author: jhawthorn (John Hawthorn)
* Status: Open
* Priority: Normal
* Assignee: matz (Yukihiro Matsumoto)
* ruby -v: ruby 3.2.0dev
* Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN
----------------------------------------
Hello!

The `protected` visibility is a bit unusual, since it depends on where the callee method is considered to be defined. I was looking into making [an optimization](https://github.com/ruby/ruby/pull/5643) to calling `protected` methods on self, and we came across some surprising behaviour. (Thanks @alanwu for finding!)

As far as I can tell, there is no way to call a method refined method is `protected` visibility (other than `send`).

``` ruby
class A
end

module MyRefine
  refine(A) {
    private def private_foo = :refined
    def private_foo_in_refinement = private_foo

    protected def protected_foo = :refined
    def protected_foo_in_refinement = protected_foo
  }
end

class A
  using MyRefine

  def call_private = private_foo
  def call_private_through_refinement = private_foo_in_refinement

  def call_protected = protected_foo
  def call_protected_through_refinement = protected_foo_in_refinement
  def is_defined = defined?(protected_foo)
end



A.new.call_private
# => :refined

A.new.call_private_through_refinement
# => :refined

A.new.call_protected
# => NoMethodError: protected method `protected_foo' called for #<A:0x00007f23f35e9390>

A.new.call_protected_through_refinement
# => NoMethodError: protected method `protected_foo' called for #<A:0x00007f23f35e9390>

A.new.is_defined
# "method"
```

I find it confusing that here protected is more restrictive than private (private methods from a refinement can be called as normal), but I'm not sure if it's a rule that it should be or just how I've always assumed it is.

It's also odd that `defined?` returns truthy, but I think this might actually be a bug on defined with protected methods (behaviour doesn't match that of method calls).

I think this is probably not intentional or desired behaviour. It's not useful for us to make methods which can't be called. The reason this happens I think is an implementation detail: the "defined class" of the method we're trying to call is the ICLASS including the refinement module onto the `A` superclass.

Possible options I see for improving this:

1. Treat defined methods as though they were defined on the refined class. Both examples above will now work, and it is possible to call the refined method on objects other than self.

2. Always allow "fcalls" to `protected` methods. Making them basically an alias for `private` when used in a refinement.

3. Forbid using `protected` inside a refinement (and `Refinement#import_methods`), raising an error.


My preference would be 1. I think it would require one extra check when calling protected methods, but calling protected methods is already a slower path so I think it is fine.

Thanks for reading!



-- 
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>

In This Thread