Project

General

Profile

Actions

Bug #16676

closed

`#hash` can change Hash object from ar_table to st_table

Added by ko1 (Koichi Sasada) about 1 year ago. Updated 7 months ago.

Status:
Closed
Priority:
Normal
Target version:
[ruby-core:97383]

Description

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) bugs_16676_patch_for_2_6.patch nagachika (Tomoyuki Chikanaga), 03/27/2020 02:24 AM
Actions

Also available in: Atom PDF