ruby-core@ruby-lang.org archive (unofficial mirror)
 help / color / mirror / Atom feed
* [ruby-core:119074] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x
@ 2024-09-06  2:04 natton (Tien Truong) via ruby-core
  2024-09-06  3:32 ` [ruby-core:119078] " jeremyevans0 (Jeremy Evans) via ruby-core
                   ` (11 more replies)
  0 siblings, 12 replies; 13+ messages in thread
From: natton (Tien Truong) via ruby-core @ 2024-09-06  2:04 UTC (permalink / raw)
  To: ruby-core; +Cc: natton (Tien Truong)

Issue #20716 has been reported by natton (Tien Truong).

----------------------------------------
Bug #20716: Different instance_method behavior in Ruby 2.7 and Ruby 3.x
https://bugs.ruby-lang.org/issues/20716

* Author: natton (Tien Truong)
* Status: Open
* ruby -v: 3.3.1
* Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
Hi, I am working on upgrading our project from 2.7 to 3.x and found a breaking change in `instance_method` behavior.
Here is the code snippet
```
module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

B.prepend(A)

a = lambda do
  puts 'lambda'
end

class C
  include B
end

B.instance_method(:test).bind(C.new).call(1)
# Ruby 2.7: 1
# Ruby 3.0: 1
# Ruby 3.1: 1

B.module_exec do
  define_method(:test, a)
end

B.instance_method(:test).bind(C.new).call
# Ruby 2.7: lambda
# Ruby 3.0: wrong number of arguments (given 0, expected 1) (ArgumentError)
# Ruby 3.1: wrong number of arguments (given 0, expected 1) (ArgumentError)
```
I don't know if this is a bug or a correct intention.

My specs:
- Ruby manager: rbenv
- Tested on 
    - ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
    - ruby 3.0.7p220 (2024-04-23 revision 724a071175) [x86_64-linux]
    - ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]
    - ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux]
    - ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [ruby-core:119078] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x
  2024-09-06  2:04 [ruby-core:119074] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x natton (Tien Truong) via ruby-core
@ 2024-09-06  3:32 ` jeremyevans0 (Jeremy Evans) via ruby-core
  2024-09-06  3:42 ` [ruby-core:119079] " natton (Tien Truong) via ruby-core
                   ` (10 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: jeremyevans0 (Jeremy Evans) via ruby-core @ 2024-09-06  3:32 UTC (permalink / raw)
  To: ruby-core; +Cc: jeremyevans0 (Jeremy Evans)

Issue #20716 has been updated by jeremyevans0 (Jeremy Evans).


This appears to be a method caching bug in `super`.  If you remove the `.call(1)`, then it works correctly.  `super_method` returns the correct method.  The `define_method(:test, a)` call should result in the method cache being cleared or ignored, but it doesn't.  However, it isn't specific to `define_method`, regular `def` results in the same behavior.

Maybe related? commit:b9007b6c548f91e88fd3f2ffa23de740431fa969

----------------------------------------
Bug #20716: Different instance_method behavior in Ruby 2.7 and Ruby 3.x
https://bugs.ruby-lang.org/issues/20716#change-109662

* Author: natton (Tien Truong)
* Status: Open
* ruby -v: 3.3.1
* Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
Hi, I am working on upgrading our project from 2.7 to 3.x and found a breaking change in `instance_method` behavior.
Here is the code snippet
```
module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

B.prepend(A)

a = lambda do
  puts 'lambda'
end

class C
  include B
end

B.instance_method(:test).bind(C.new).call(1)
# Ruby 2.7: 1
# Ruby 3.0: 1
# Ruby 3.1: 1

B.module_exec do
  define_method(:test, a)
end

B.instance_method(:test).bind(C.new).call
# Ruby 2.7: lambda
# Ruby 3.0: wrong number of arguments (given 0, expected 1) (ArgumentError)
# Ruby 3.1: wrong number of arguments (given 0, expected 1) (ArgumentError)
```
I don't know if this is a bug or a correct intention.

My specs:
- Ruby manager: rbenv
- Tested on 
    - ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
    - ruby 3.0.7p220 (2024-04-23 revision 724a071175) [x86_64-linux]
    - ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]
    - ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux]
    - ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [ruby-core:119079] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x
  2024-09-06  2:04 [ruby-core:119074] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x natton (Tien Truong) via ruby-core
  2024-09-06  3:32 ` [ruby-core:119078] " jeremyevans0 (Jeremy Evans) via ruby-core
@ 2024-09-06  3:42 ` natton (Tien Truong) via ruby-core
  2024-09-07  0:00 ` [ruby-core:119094] " jeremyevans0 (Jeremy Evans) via ruby-core
                   ` (9 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: natton (Tien Truong) via ruby-core @ 2024-09-06  3:42 UTC (permalink / raw)
  To: ruby-core; +Cc: natton (Tien Truong)

Issue #20716 has been updated by natton (Tien Truong).


Yes, you are correct. This isn't specific to `define_method`. I modified the snippet a little bit
```
module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

B.prepend(A)

class C
  include B
end

C.new.test(1)
# Ruby 2.7: 1
# Ruby 3.0: 1
# Ruby 3.1: 1

module B
  def test
    puts 'new test'
  end
end

C.new.test
# Ruby 2.7: 'new test'
# Ruby 3.0: wrong number of arguments (given 0, expected 1) (ArgumentError)
# Ruby 3.1: wrong number of arguments (given 0, expected 1) (ArgumentError)
```

----------------------------------------
Bug #20716: Different instance_method behavior in Ruby 2.7 and Ruby 3.x
https://bugs.ruby-lang.org/issues/20716#change-109663

* Author: natton (Tien Truong)
* Status: Open
* ruby -v: 3.3.1
* Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
Hi, I am working on upgrading our project from 2.7 to 3.x and found a breaking change in `instance_method` behavior.
Here is the code snippet
```
module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

B.prepend(A)

a = lambda do
  puts 'lambda'
end

class C
  include B
end

B.instance_method(:test).bind(C.new).call(1)
# Ruby 2.7: 1
# Ruby 3.0: 1
# Ruby 3.1: 1

B.module_exec do
  define_method(:test, a)
end

B.instance_method(:test).bind(C.new).call
# Ruby 2.7: lambda
# Ruby 3.0: wrong number of arguments (given 0, expected 1) (ArgumentError)
# Ruby 3.1: wrong number of arguments (given 0, expected 1) (ArgumentError)
```
I don't know if this is a bug or a correct intention.

My specs:
- Ruby manager: rbenv
- Tested on 
    - ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
    - ruby 3.0.7p220 (2024-04-23 revision 724a071175) [x86_64-linux]
    - ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]
    - ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux]
    - ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [ruby-core:119094] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x
  2024-09-06  2:04 [ruby-core:119074] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x natton (Tien Truong) via ruby-core
  2024-09-06  3:32 ` [ruby-core:119078] " jeremyevans0 (Jeremy Evans) via ruby-core
  2024-09-06  3:42 ` [ruby-core:119079] " natton (Tien Truong) via ruby-core
@ 2024-09-07  0:00 ` jeremyevans0 (Jeremy Evans) via ruby-core
  2024-09-09  2:39 ` [ruby-core:119101] " natton (Tien Truong) via ruby-core
                   ` (8 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: jeremyevans0 (Jeremy Evans) via ruby-core @ 2024-09-07  0:00 UTC (permalink / raw)
  To: ruby-core; +Cc: jeremyevans0 (Jeremy Evans)

Issue #20716 has been updated by jeremyevans0 (Jeremy Evans).


This behavior isn't related to `instance_method`.  It occurs in the following code:

```ruby
module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

class C; end

B.prepend(A)
C.include(B)

C.new.test 1

module B
  def test
    puts 'lambda'
  end
end

C.new.test
```

It also happens when you replace `C.include(B)` with `C.prepend(B)`.

It does not happen when you replace `B.prepend(A); C.include(B)` with `A.include(B); C.include(A)`.  It also does not happen if a class directly prepends a module, such as in this example:

```ruby
module A
  def test(*args)
    super
  end
end

class B
  def test(a)
    puts a
  end
end

B.prepend(A)

B.new.test 1

class B
  def test
    puts 'lambda'
  end
end

B.new.test
```

It seems like the conditions are:

* Class includes or prepends module X that prepends module Y
* Both X and Y define method M
* Y's definition of M calls `super`
* X's definition of M is overridden after `super` method call is cached

----------------------------------------
Bug #20716: Different instance_method behavior in Ruby 2.7 and Ruby 3.x
https://bugs.ruby-lang.org/issues/20716#change-109681

* Author: natton (Tien Truong)
* Status: Open
* ruby -v: 3.3.1
* Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
Hi, I am working on upgrading our project from 2.7 to 3.x and found a breaking change in `instance_method` behavior.
Here is the code snippet
```
module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

B.prepend(A)

a = lambda do
  puts 'lambda'
end

class C
  include B
end

B.instance_method(:test).bind(C.new).call(1)
# Ruby 2.7: 1
# Ruby 3.0: 1
# Ruby 3.1: 1

B.module_exec do
  define_method(:test, a)
end

B.instance_method(:test).bind(C.new).call
# Ruby 2.7: lambda
# Ruby 3.0: wrong number of arguments (given 0, expected 1) (ArgumentError)
# Ruby 3.1: wrong number of arguments (given 0, expected 1) (ArgumentError)
```
I don't know if this is a bug or a correct intention.

My specs:
- Ruby manager: rbenv
- Tested on 
    - ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
    - ruby 3.0.7p220 (2024-04-23 revision 724a071175) [x86_64-linux]
    - ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]
    - ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux]
    - ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [ruby-core:119101] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x
  2024-09-06  2:04 [ruby-core:119074] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x natton (Tien Truong) via ruby-core
                   ` (2 preceding siblings ...)
  2024-09-07  0:00 ` [ruby-core:119094] " jeremyevans0 (Jeremy Evans) via ruby-core
@ 2024-09-09  2:39 ` natton (Tien Truong) via ruby-core
  2024-09-09  3:27 ` [ruby-core:119102] " jeremyevans0 (Jeremy Evans) via ruby-core
                   ` (7 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: natton (Tien Truong) via ruby-core @ 2024-09-09  2:39 UTC (permalink / raw)
  To: ruby-core; +Cc: natton (Tien Truong)

Issue #20716 has been updated by natton (Tien Truong).


Hi Evans,

Thank you for your confirmation.
I am new here so is there anything I can do to escalate this or how can I help to resolve this issue?




----------------------------------------
Bug #20716: Different instance_method behavior in Ruby 2.7 and Ruby 3.x
https://bugs.ruby-lang.org/issues/20716#change-109689

* Author: natton (Tien Truong)
* Status: Open
* ruby -v: 3.3.1
* Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
Hi, I am working on upgrading our project from 2.7 to 3.x and found a breaking change in `instance_method` behavior.
Here is the code snippet
```
module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

B.prepend(A)

a = lambda do
  puts 'lambda'
end

class C
  include B
end

B.instance_method(:test).bind(C.new).call(1)
# Ruby 2.7: 1
# Ruby 3.0: 1
# Ruby 3.1: 1

B.module_exec do
  define_method(:test, a)
end

B.instance_method(:test).bind(C.new).call
# Ruby 2.7: lambda
# Ruby 3.0: wrong number of arguments (given 0, expected 1) (ArgumentError)
# Ruby 3.1: wrong number of arguments (given 0, expected 1) (ArgumentError)
```
I don't know if this is a bug or a correct intention.

My specs:
- Ruby manager: rbenv
- Tested on 
    - ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
    - ruby 3.0.7p220 (2024-04-23 revision 724a071175) [x86_64-linux]
    - ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]
    - ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux]
    - ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [ruby-core:119102] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x
  2024-09-06  2:04 [ruby-core:119074] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x natton (Tien Truong) via ruby-core
                   ` (3 preceding siblings ...)
  2024-09-09  2:39 ` [ruby-core:119101] " natton (Tien Truong) via ruby-core
@ 2024-09-09  3:27 ` jeremyevans0 (Jeremy Evans) via ruby-core
  2024-09-10  5:26 ` [ruby-core:119108] " jeremyevans0 (Jeremy Evans) via ruby-core
                   ` (6 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: jeremyevans0 (Jeremy Evans) via ruby-core @ 2024-09-09  3:27 UTC (permalink / raw)
  To: ruby-core; +Cc: jeremyevans0 (Jeremy Evans)

Issue #20716 has been updated by jeremyevans0 (Jeremy Evans).


natton (Tien Truong) wrote in #note-4:
> I am new here so is there anything I can do to escalate this or how can I help to resolve this issue?

There isn't an escalation process in place in Ruby, as it is an open source project managed by volunteers.  In terms of helping to resolve the issue, first, we need to determine the cause of the bug.  Bisecting changes between 2.7 and 3.0 would help here to confirm the actual commit that caused the issue (the commit I listed in  an early comment is just a guess). I tried bisecting myself, but I think the current version of bison doesn't work with the parse.y of 2.7, so bisecting is more challenging than usual.

After the problem has been determined, then an appropriate fix needs to be determined. This is likely more challenging, and requires knowledge and/or study of how method caching works in Ruby.

If this isn't work you are comfortable doing yourself, and it's important enough that you are willing to pay to have it fixed, you could pay a developer to do so on your behalf, or you could offer a bounty for a developer to fix it for you.  There are no guarantees of success, of course, but it likely increases the odds.

Considering this bug has been around for about 4 years, and this is the first time it has been reported, this doesn't seem like a major issue, and it should be fairly easy to work around by overriding the method before calling `super`.  That said, I would still like to see it fixed, and likely will work on it more myself at some point.  However, I don't have extensive knowledge of Ruby's method caching, and there are other bugs I'm working on fixing.

----------------------------------------
Bug #20716: Different instance_method behavior in Ruby 2.7 and Ruby 3.x
https://bugs.ruby-lang.org/issues/20716#change-109690

* Author: natton (Tien Truong)
* Status: Open
* ruby -v: 3.3.1
* Backport: 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN
----------------------------------------
Hi, I am working on upgrading our project from 2.7 to 3.x and found a breaking change in `instance_method` behavior.
Here is the code snippet
```
module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

B.prepend(A)

a = lambda do
  puts 'lambda'
end

class C
  include B
end

B.instance_method(:test).bind(C.new).call(1)
# Ruby 2.7: 1
# Ruby 3.0: 1
# Ruby 3.1: 1

B.module_exec do
  define_method(:test, a)
end

B.instance_method(:test).bind(C.new).call
# Ruby 2.7: lambda
# Ruby 3.0: wrong number of arguments (given 0, expected 1) (ArgumentError)
# Ruby 3.1: wrong number of arguments (given 0, expected 1) (ArgumentError)
```
I don't know if this is a bug or a correct intention.

My specs:
- Ruby manager: rbenv
- Tested on 
    - ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
    - ruby 3.0.7p220 (2024-04-23 revision 724a071175) [x86_64-linux]
    - ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]
    - ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux]
    - ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [ruby-core:119108] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x
  2024-09-06  2:04 [ruby-core:119074] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x natton (Tien Truong) via ruby-core
                   ` (4 preceding siblings ...)
  2024-09-09  3:27 ` [ruby-core:119102] " jeremyevans0 (Jeremy Evans) via ruby-core
@ 2024-09-10  5:26 ` jeremyevans0 (Jeremy Evans) via ruby-core
  2024-09-10 14:46 ` [ruby-core:119114] " natton (Tien Truong) via ruby-core
                   ` (5 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: jeremyevans0 (Jeremy Evans) via ruby-core @ 2024-09-10  5:26 UTC (permalink / raw)
  To: ruby-core; +Cc: jeremyevans0 (Jeremy Evans)

Issue #20716 has been updated by jeremyevans0 (Jeremy Evans).

Backport changed from 3.1: UNKNOWN, 3.2: UNKNOWN, 3.3: UNKNOWN to 3.1: REQUIRED, 3.2: REQUIRED, 3.3: REQUIRED

I was able to track down the cause and submitted a pull request to fix this: https://github.com/ruby/ruby/pull/11582

It appears to be introduced by commit:ad729a1d11c6c57efd2e92803b4e937db0f75252, which I wrote and which was a fix for #16736.

----------------------------------------
Bug #20716: Different instance_method behavior in Ruby 2.7 and Ruby 3.x
https://bugs.ruby-lang.org/issues/20716#change-109701

* Author: natton (Tien Truong)
* Status: Open
* ruby -v: 3.3.1
* Backport: 3.1: REQUIRED, 3.2: REQUIRED, 3.3: REQUIRED
----------------------------------------
Hi, I am working on upgrading our project from 2.7 to 3.x and found a breaking change in `instance_method` behavior.
Here is the code snippet
```
module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

B.prepend(A)

a = lambda do
  puts 'lambda'
end

class C
  include B
end

B.instance_method(:test).bind(C.new).call(1)
# Ruby 2.7: 1
# Ruby 3.0: 1
# Ruby 3.1: 1

B.module_exec do
  define_method(:test, a)
end

B.instance_method(:test).bind(C.new).call
# Ruby 2.7: lambda
# Ruby 3.0: wrong number of arguments (given 0, expected 1) (ArgumentError)
# Ruby 3.1: wrong number of arguments (given 0, expected 1) (ArgumentError)
```
I don't know if this is a bug or a correct intention.

My specs:
- Ruby manager: rbenv
- Tested on 
    - ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
    - ruby 3.0.7p220 (2024-04-23 revision 724a071175) [x86_64-linux]
    - ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]
    - ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux]
    - ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [ruby-core:119114] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x
  2024-09-06  2:04 [ruby-core:119074] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x natton (Tien Truong) via ruby-core
                   ` (5 preceding siblings ...)
  2024-09-10  5:26 ` [ruby-core:119108] " jeremyevans0 (Jeremy Evans) via ruby-core
@ 2024-09-10 14:46 ` natton (Tien Truong) via ruby-core
  2024-10-21  8:50 ` [ruby-core:119535] " natton (Tien Truong) via ruby-core
                   ` (4 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: natton (Tien Truong) via ruby-core @ 2024-09-10 14:46 UTC (permalink / raw)
  To: ruby-core; +Cc: natton (Tien Truong)

Issue #20716 has been updated by natton (Tien Truong).


Hi Evans,

Thank you for your guidance and the quick fix.
I truly appreciate it

----------------------------------------
Bug #20716: Different instance_method behavior in Ruby 2.7 and Ruby 3.x
https://bugs.ruby-lang.org/issues/20716#change-109707

* Author: natton (Tien Truong)
* Status: Open
* ruby -v: 3.3.1
* Backport: 3.1: REQUIRED, 3.2: REQUIRED, 3.3: REQUIRED
----------------------------------------
Hi, I am working on upgrading our project from 2.7 to 3.x and found a breaking change in `instance_method` behavior.
Here is the code snippet
```
module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

B.prepend(A)

a = lambda do
  puts 'lambda'
end

class C
  include B
end

B.instance_method(:test).bind(C.new).call(1)
# Ruby 2.7: 1
# Ruby 3.0: 1
# Ruby 3.1: 1

B.module_exec do
  define_method(:test, a)
end

B.instance_method(:test).bind(C.new).call
# Ruby 2.7: lambda
# Ruby 3.0: wrong number of arguments (given 0, expected 1) (ArgumentError)
# Ruby 3.1: wrong number of arguments (given 0, expected 1) (ArgumentError)
```
I don't know if this is a bug or a correct intention.

My specs:
- Ruby manager: rbenv
- Tested on 
    - ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
    - ruby 3.0.7p220 (2024-04-23 revision 724a071175) [x86_64-linux]
    - ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]
    - ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux]
    - ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [ruby-core:119535] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x
  2024-09-06  2:04 [ruby-core:119074] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x natton (Tien Truong) via ruby-core
                   ` (6 preceding siblings ...)
  2024-09-10 14:46 ` [ruby-core:119114] " natton (Tien Truong) via ruby-core
@ 2024-10-21  8:50 ` natton (Tien Truong) via ruby-core
  2024-10-21  8:50 ` [ruby-core:119545] " nagachika (Tomoyuki Chikanaga) via ruby-core
                   ` (3 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: natton (Tien Truong) via ruby-core @ 2024-10-21  8:50 UTC (permalink / raw)
  To: ruby-core; +Cc: natton (Tien Truong)

Issue #20716 has been updated by natton (Tien Truong).


Hi Evans,

I am sorry for my late response.
Is there a way to backport this fix to Ruby version 3.1 and 3.2

----------------------------------------
Bug #20716: Different instance_method behavior in Ruby 2.7 and Ruby 3.x
https://bugs.ruby-lang.org/issues/20716#change-110148

* Author: natton (Tien Truong)
* Status: Closed
* ruby -v: 3.3.1
* Backport: 3.1: REQUIRED, 3.2: DONE, 3.3: REQUIRED
----------------------------------------
Hi, I am working on upgrading our project from 2.7 to 3.x and found a breaking change in `instance_method` behavior.
Here is the code snippet
```
module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

B.prepend(A)

a = lambda do
  puts 'lambda'
end

class C
  include B
end

B.instance_method(:test).bind(C.new).call(1)
# Ruby 2.7: 1
# Ruby 3.0: 1
# Ruby 3.1: 1

B.module_exec do
  define_method(:test, a)
end

B.instance_method(:test).bind(C.new).call
# Ruby 2.7: lambda
# Ruby 3.0: wrong number of arguments (given 0, expected 1) (ArgumentError)
# Ruby 3.1: wrong number of arguments (given 0, expected 1) (ArgumentError)
```
I don't know if this is a bug or a correct intention.

My specs:
- Ruby manager: rbenv
- Tested on 
    - ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
    - ruby 3.0.7p220 (2024-04-23 revision 724a071175) [x86_64-linux]
    - ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]
    - ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux]
    - ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [ruby-core:119545] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x
  2024-09-06  2:04 [ruby-core:119074] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x natton (Tien Truong) via ruby-core
                   ` (7 preceding siblings ...)
  2024-10-21  8:50 ` [ruby-core:119535] " natton (Tien Truong) via ruby-core
@ 2024-10-21  8:50 ` nagachika (Tomoyuki Chikanaga) via ruby-core
  2024-10-21 15:12 ` [ruby-core:119573] " jeremyevans0 (Jeremy Evans) via ruby-core
                   ` (2 subsequent siblings)
  11 siblings, 0 replies; 13+ messages in thread
From: nagachika (Tomoyuki Chikanaga) via ruby-core @ 2024-10-21  8:50 UTC (permalink / raw)
  To: ruby-core; +Cc: nagachika (Tomoyuki Chikanaga)

Issue #20716 has been updated by nagachika (Tomoyuki Chikanaga).

Backport changed from 3.1: REQUIRED, 3.2: REQUIRED, 3.3: REQUIRED to 3.1: REQUIRED, 3.2: DONE, 3.3: REQUIRED

ruby_3_2 commit:cb75fcef6feb126a67874109ce1503976a6f90cc merged revision(s) commit:6118e8a47394409b53164b60e79fadf348b97db3, commit:dc64448202299633a235f310b8bf2192263f274f.

----------------------------------------
Bug #20716: Different instance_method behavior in Ruby 2.7 and Ruby 3.x
https://bugs.ruby-lang.org/issues/20716#change-110162

* Author: natton (Tien Truong)
* Status: Closed
* ruby -v: 3.3.1
* Backport: 3.1: REQUIRED, 3.2: DONE, 3.3: REQUIRED
----------------------------------------
Hi, I am working on upgrading our project from 2.7 to 3.x and found a breaking change in `instance_method` behavior.
Here is the code snippet
```
module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

B.prepend(A)

a = lambda do
  puts 'lambda'
end

class C
  include B
end

B.instance_method(:test).bind(C.new).call(1)
# Ruby 2.7: 1
# Ruby 3.0: 1
# Ruby 3.1: 1

B.module_exec do
  define_method(:test, a)
end

B.instance_method(:test).bind(C.new).call
# Ruby 2.7: lambda
# Ruby 3.0: wrong number of arguments (given 0, expected 1) (ArgumentError)
# Ruby 3.1: wrong number of arguments (given 0, expected 1) (ArgumentError)
```
I don't know if this is a bug or a correct intention.

My specs:
- Ruby manager: rbenv
- Tested on 
    - ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
    - ruby 3.0.7p220 (2024-04-23 revision 724a071175) [x86_64-linux]
    - ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]
    - ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux]
    - ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [ruby-core:119573] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x
  2024-09-06  2:04 [ruby-core:119074] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x natton (Tien Truong) via ruby-core
                   ` (8 preceding siblings ...)
  2024-10-21  8:50 ` [ruby-core:119545] " nagachika (Tomoyuki Chikanaga) via ruby-core
@ 2024-10-21 15:12 ` jeremyevans0 (Jeremy Evans) via ruby-core
  2024-10-22  1:51 ` [ruby-core:119584] " natton (Tien Truong) via ruby-core
  2024-11-04 22:43 ` [ruby-core:119713] " k0kubun (Takashi Kokubun) via ruby-core
  11 siblings, 0 replies; 13+ messages in thread
From: jeremyevans0 (Jeremy Evans) via ruby-core @ 2024-10-21 15:12 UTC (permalink / raw)
  To: ruby-core; +Cc: jeremyevans0 (Jeremy Evans)

Issue #20716 has been updated by jeremyevans0 (Jeremy Evans).


natton (Tien Truong) wrote in #note-9:
> Is there a way to backport this fix to Ruby version 3.1 and 3.2

Ruby 3.2 was recently fixed, and it will be in the next Ruby 3.2 release.  Ruby 3.1 is in security fix only mode, and this is not a security fix, so I do not think it will be patched.

----------------------------------------
Bug #20716: Different instance_method behavior in Ruby 2.7 and Ruby 3.x
https://bugs.ruby-lang.org/issues/20716#change-110192

* Author: natton (Tien Truong)
* Status: Closed
* ruby -v: 3.3.1
* Backport: 3.1: REQUIRED, 3.2: DONE, 3.3: REQUIRED
----------------------------------------
Hi, I am working on upgrading our project from 2.7 to 3.x and found a breaking change in `instance_method` behavior.
Here is the code snippet
```
module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

B.prepend(A)

a = lambda do
  puts 'lambda'
end

class C
  include B
end

B.instance_method(:test).bind(C.new).call(1)
# Ruby 2.7: 1
# Ruby 3.0: 1
# Ruby 3.1: 1

B.module_exec do
  define_method(:test, a)
end

B.instance_method(:test).bind(C.new).call
# Ruby 2.7: lambda
# Ruby 3.0: wrong number of arguments (given 0, expected 1) (ArgumentError)
# Ruby 3.1: wrong number of arguments (given 0, expected 1) (ArgumentError)
```
I don't know if this is a bug or a correct intention.

My specs:
- Ruby manager: rbenv
- Tested on 
    - ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
    - ruby 3.0.7p220 (2024-04-23 revision 724a071175) [x86_64-linux]
    - ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]
    - ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux]
    - ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [ruby-core:119584] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x
  2024-09-06  2:04 [ruby-core:119074] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x natton (Tien Truong) via ruby-core
                   ` (9 preceding siblings ...)
  2024-10-21 15:12 ` [ruby-core:119573] " jeremyevans0 (Jeremy Evans) via ruby-core
@ 2024-10-22  1:51 ` natton (Tien Truong) via ruby-core
  2024-11-04 22:43 ` [ruby-core:119713] " k0kubun (Takashi Kokubun) via ruby-core
  11 siblings, 0 replies; 13+ messages in thread
From: natton (Tien Truong) via ruby-core @ 2024-10-22  1:51 UTC (permalink / raw)
  To: ruby-core; +Cc: natton (Tien Truong)

Issue #20716 has been updated by natton (Tien Truong).


Yes, thank you for the fix. 

----------------------------------------
Bug #20716: Different instance_method behavior in Ruby 2.7 and Ruby 3.x
https://bugs.ruby-lang.org/issues/20716#change-110203

* Author: natton (Tien Truong)
* Status: Closed
* ruby -v: 3.3.1
* Backport: 3.1: REQUIRED, 3.2: DONE, 3.3: REQUIRED
----------------------------------------
Hi, I am working on upgrading our project from 2.7 to 3.x and found a breaking change in `instance_method` behavior.
Here is the code snippet
```
module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

B.prepend(A)

a = lambda do
  puts 'lambda'
end

class C
  include B
end

B.instance_method(:test).bind(C.new).call(1)
# Ruby 2.7: 1
# Ruby 3.0: 1
# Ruby 3.1: 1

B.module_exec do
  define_method(:test, a)
end

B.instance_method(:test).bind(C.new).call
# Ruby 2.7: lambda
# Ruby 3.0: wrong number of arguments (given 0, expected 1) (ArgumentError)
# Ruby 3.1: wrong number of arguments (given 0, expected 1) (ArgumentError)
```
I don't know if this is a bug or a correct intention.

My specs:
- Ruby manager: rbenv
- Tested on 
    - ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
    - ruby 3.0.7p220 (2024-04-23 revision 724a071175) [x86_64-linux]
    - ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]
    - ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux]
    - ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* [ruby-core:119713] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x
  2024-09-06  2:04 [ruby-core:119074] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x natton (Tien Truong) via ruby-core
                   ` (10 preceding siblings ...)
  2024-10-22  1:51 ` [ruby-core:119584] " natton (Tien Truong) via ruby-core
@ 2024-11-04 22:43 ` k0kubun (Takashi Kokubun) via ruby-core
  11 siblings, 0 replies; 13+ messages in thread
From: k0kubun (Takashi Kokubun) via ruby-core @ 2024-11-04 22:43 UTC (permalink / raw)
  To: ruby-core; +Cc: k0kubun (Takashi Kokubun)

Issue #20716 has been updated by k0kubun (Takashi Kokubun).

Backport changed from 3.1: REQUIRED, 3.2: DONE, 3.3: REQUIRED to 3.1: REQUIRED, 3.2: DONE, 3.3: DONE

ruby_3_3 commit:edeb0319f7a95dfe3f9b895bcf32371dd8514726 merged revision(s) commit:6118e8a47394409b53164b60e79fadf348b97db3.

----------------------------------------
Bug #20716: Different instance_method behavior in Ruby 2.7 and Ruby 3.x
https://bugs.ruby-lang.org/issues/20716#change-110377

* Author: natton (Tien Truong)
* Status: Closed
* ruby -v: 3.3.1
* Backport: 3.1: REQUIRED, 3.2: DONE, 3.3: DONE
----------------------------------------
Hi, I am working on upgrading our project from 2.7 to 3.x and found a breaking change in `instance_method` behavior.
Here is the code snippet
```
module A
  def test(*args)
    super
  end
end

module B
  def test(a)
    puts a
  end
end

B.prepend(A)

a = lambda do
  puts 'lambda'
end

class C
  include B
end

B.instance_method(:test).bind(C.new).call(1)
# Ruby 2.7: 1
# Ruby 3.0: 1
# Ruby 3.1: 1

B.module_exec do
  define_method(:test, a)
end

B.instance_method(:test).bind(C.new).call
# Ruby 2.7: lambda
# Ruby 3.0: wrong number of arguments (given 0, expected 1) (ArgumentError)
# Ruby 3.1: wrong number of arguments (given 0, expected 1) (ArgumentError)
```
I don't know if this is a bug or a correct intention.

My specs:
- Ruby manager: rbenv
- Tested on 
    - ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
    - ruby 3.0.7p220 (2024-04-23 revision 724a071175) [x86_64-linux]
    - ruby 3.1.4p223 (2023-03-30 revision 957bb7cb81) [x86_64-linux]
    - ruby 3.2.3 (2024-01-18 revision 52bb2ac0a6) [x86_64-linux]
    - ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-linux]





-- 
https://bugs.ruby-lang.org/
 ______________________________________________
 ruby-core mailing list -- ruby-core@ml.ruby-lang.org
 To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org
 ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2024-11-04 22:43 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-09-06  2:04 [ruby-core:119074] [Ruby master Bug#20716] Different instance_method behavior in Ruby 2.7 and Ruby 3.x natton (Tien Truong) via ruby-core
2024-09-06  3:32 ` [ruby-core:119078] " jeremyevans0 (Jeremy Evans) via ruby-core
2024-09-06  3:42 ` [ruby-core:119079] " natton (Tien Truong) via ruby-core
2024-09-07  0:00 ` [ruby-core:119094] " jeremyevans0 (Jeremy Evans) via ruby-core
2024-09-09  2:39 ` [ruby-core:119101] " natton (Tien Truong) via ruby-core
2024-09-09  3:27 ` [ruby-core:119102] " jeremyevans0 (Jeremy Evans) via ruby-core
2024-09-10  5:26 ` [ruby-core:119108] " jeremyevans0 (Jeremy Evans) via ruby-core
2024-09-10 14:46 ` [ruby-core:119114] " natton (Tien Truong) via ruby-core
2024-10-21  8:50 ` [ruby-core:119535] " natton (Tien Truong) via ruby-core
2024-10-21  8:50 ` [ruby-core:119545] " nagachika (Tomoyuki Chikanaga) via ruby-core
2024-10-21 15:12 ` [ruby-core:119573] " jeremyevans0 (Jeremy Evans) via ruby-core
2024-10-22  1:51 ` [ruby-core:119584] " natton (Tien Truong) via ruby-core
2024-11-04 22:43 ` [ruby-core:119713] " k0kubun (Takashi Kokubun) via ruby-core

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 NNTP newsgroup(s).