[#68478] Looking for MRI projects for Ruby Google Summer of Code 2015 — Tony Arcieri <bascule@...>

Hi ruby-core,

10 messages 2015/03/10

[ruby-core:68578] [Ruby trunk - Bug #10985] Ruby 2.2 respond_to_missing?/method_missing/Object#method is not detecting properly

From: michael.j.herold@...
Date: 2015-03-20 13:49:32 UTC
List: ruby-core #68578
Issue #10985 has been updated by Michael Herold.


Thank you for the fix and the swift turnaround, Nakada-san! I'm looking forward to the backport.

----------------------------------------
Bug #10985: Ruby 2.2 respond_to_missing?/method_missing/Object#method is not detecting properly
https://bugs.ruby-lang.org/issues/10985#change-51890

* Author: Michael Herold
* Status: Closed
* Priority: Normal
* Assignee: 
* ruby -v: 2.2.1p85
* Backport: 2.0.0: DONTNEED, 2.1: DONTNEED, 2.2: REQUIRED
----------------------------------------
I'm one of the maintainers of the hashie gem. We had some reports that one of our specs started failing with Ruby 2.2 (and it was failing in ruby-head before then, but no one noticed), where `Object#method` was not picking up a `respond_to_missing?`/`method_missing` combo for our dynamic setters. This only occurs when we are dynamically constructing the method name from a string.

I have isolated the issue out into a tiny sample project that shows the issue. You can see that sample [on Github][regression_test]. That repository is set up to have Travis run on Ruby 2.1.5, 2.2.0, 2.2.1, and ruby-head to show that the issue is introduced in the 2.2 line.

I'm having trouble isolating the issue down at the C level, but from a Ruby level, it seems that dynamically constructed symbols aren't the same as explicitly constructed (i.e. fully typed out) symbols. Using the syntax from my little test repository:

```ruby
widget = Widget.new

widget.method(:abc=)  #=> This is found
widget.method("abc=") #=> This is found because it has previously been accessed via a symbol

widget.method("xyz=") #=> This is NOT found
widget.method(:xyz=)  #=> This is found
widget.method("xyz=") #=> Now this is found because it was previously accessed via a symbol
```

Because of that behavior, it makes me think that something is happening with the conversion of the argument to a symbol, but that could be way off.

Please let me know if the explanation is vague. I'm happy to provide any more information that you would find helpful.

[regression_test]: https://github.com/michaelherold/method_missing_regression



-- 
https://bugs.ruby-lang.org/

In This Thread

Prev Next