From: "Eregon (Benoit Daloze)" Date: 2022-03-31T10:33:58+00:00 Subject: [ruby-core:108134] [Ruby master Bug#18671] ruby2_keywords_hash not #equal? to itself with __send__ Issue #18671 has been updated by Eregon (Benoit Daloze). Indeed: ```ruby h = {a: 1} h = Hash.ruby2_keywords_hash(h) args = [h] p h.equal?(h) # => true p h.equal?(*args) # => false p h.equal?(*args, **{}) # => true ``` What was very confusing is in ruby/spec, I had code like: ```ruby after_usage.should_not.equal?(marked) ``` to check whether a copy was made for #18625. And this didn't fail, even though `after_usage` and `marked` are the same object. The reason is this behavior, and MSpec internally dispatching through `__send__`. I worked around it by calling `equal?` more directly and avoiding `__send__` for the case of `equal?` but obviously it's kind of a hack. What this means is `ruby2_keywords` delegation doesn't preserve identity of the last argument if it is a marked Hash. And an unintentionally marked Hash does not seem so unlikely to happen with #18625. I updated the description of #18625 to this, there is no copy currently on master for that case (I misunderstood that originally due to this issue): ```ruby after_usage.equal?(marked) # => true, BUG, should be false ``` ---------------------------------------- Bug #18671: ruby2_keywords_hash not #equal? to itself with __send__ https://bugs.ruby-lang.org/issues/18671#change-97110 * Author: Eregon (Benoit Daloze) * Status: Rejected * Priority: Normal * ruby -v: ruby 3.0.3p157 (2021-11-24 revision 3fb7d2cadc) [x86_64-linux] * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN ---------------------------------------- ```ruby h = {a: 1} h = Hash.ruby2_keywords_hash(h) args = [h] p h.equal?(h) # => true p h.__send__(:equal?, *args) # => false ``` -- https://bugs.ruby-lang.org/ Unsubscribe: