Actions
Bug #16676
closed`#hash` can change Hash object from ar_table to st_table
Bug #16676:
`#hash` can change Hash object from ar_table to st_table
Description
Points¶
- Hash representation
ar_tablehas 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
Actions