[prev in list] [next in list] [prev in thread] [next in thread] 

List:       ruby-core
Subject:    [ruby-core:108134] [Ruby master Bug#18671] ruby2_keywords_hash not #equal? to itself with __send__
From:       "Eregon (Benoit Daloze)" <noreply () ruby-lang ! org>
Date:       2022-03-31 10:33:58
Message-ID: redmine.journal-97110.20220331103357.772 () ruby-lang ! org
[Download RAW message or body]

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: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic