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

File bugs_16676_patch_for_2_6.patch added

I created the patch for ruby_2_6 branch (attatched file).

But the test_ar2st failed.

```
  1) Failure:
TestHash#test_ar2st [/Users/nagachika/opt/ruby-2.6/src/ruby_2_6/test/ruby/test_hash.rb:1749]:
<"{0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9, test=>true}"> expected but was
<"{0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9}">.

  2) Failure:
TestHash::TestSubHash#test_ar2st [/Users/nagachika/opt/ruby-2.6/src/ruby_2_6/test/ruby/test_hash.rb:1749]:
<"{0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9, test=>true}"> expected but was
<"{0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9}">.
```

----------------------------------------
Bug #16676: `#hash` can change Hash object from ar_table to st_table
https://bugs.ruby-lang.org/issues/16676#change-84787

* Author: ko1 (Koichi Sasada)
* Status: Closed
* Priority: Normal
* Assignee: ko1 (Koichi Sasada)
* Target version: 2.8
* Backport: 2.5: UNKNOWN, 2.6: REQUIRED, 2.7: DONE
----------------------------------------
# Points

* Hash representation `ar_table` has a problem from Ruby 2.6 (need to backport)

# Problem

From Ruby 2.6 `Hash` object is represented by `ar_table` (for small (<=8) pairs) and `st_table`.
To lookup hash table, `Object#hash` is called to get a hash value, and this method call can modify Hash object.
It means that the code assumes the Hash representation is a `ar_table`, but calling the `#hash` method, it can be a `st_table`.

I believe nobody modify Hash table from `#hash` method (it should be pure, no-side effect method), but multi-threads can modify a Hash object, it can be exposed.

I will commit a patch soon.

# Workaround

To avoid this issue, making a hash table in `st_table`, for example:

```
h = {} # ar_table
10.times{|i| h[i] = i} # st_table because the number of pair == 10 (> 8)
h.clear
```


---Files--------------------------------
bugs_16676_patch_for_2_6.patch (3.37 KB)


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