Project

General

Profile

Bug #16676 » bugs_16676_patch_for_2_6.patch

nagachika (Tomoyuki Chikanaga), 03/27/2020 02:24 AM

View differences:

hash.c (作業コピー)
{
st_table *new_tab;
ar_table_entry *entry;
const unsigned size = RHASH_AR_TABLE_SIZE(hash);
unsigned size;
st_index_t i;
if (!RHASH_AR_TABLE_P(hash) || size < RHASH_AR_TABLE_MAX_SIZE) {
if (!RHASH_AR_TABLE_P(hash)) return;
size = RHASH_AR_TABLE_SIZE(hash);
if (size < RHASH_AR_TABLE_MAX_SIZE) {
return;
}
......
st_data_t value = 0, old_key;
st_hash_t hash_value = do_hash(key);
if (UNLIKELY(!RHASH_AR_TABLE_P(hash))) {
/* `#hash` changes ar_table -> st_table */
return -1;
}
if (RHASH_AR_TABLE_SIZE(hash) > 0) {
bin = find_entry(hash, hash_value, key);
existing = (bin != RHASH_AR_TABLE_MAX_BOUND) ? TRUE : FALSE;
......
unsigned bin = RHASH_AR_TABLE_BOUND(hash);
st_hash_t hash_value = do_hash(key);
if (UNLIKELY(!RHASH_AR_TABLE_P(hash))) {
/* `#hash` changes ar_table -> st_table */
return -1;
}
hash_ar_table(hash); /* prepare ltbl */
bin = find_entry(hash, hash_value, key);
......
ar_lookup(VALUE hash, st_data_t key, st_data_t *value)
{
st_hash_t hash_value = do_hash(key);
unsigned bin = find_entry(hash, hash_value, key);
unsigned bin;
if (UNLIKELY(!RHASH_AR_TABLE_P(hash))) {
/* `#hash` changes ar_table -> st_table */
return st_lookup(RHASH_ST_TABLE(hash), key, value);
}
bin = find_entry(hash, hash_value, key);
if (bin == RHASH_AR_TABLE_MAX_BOUND) {
return 0;
......
unsigned bin;
st_hash_t hash_value = do_hash(*key);
if (UNLIKELY(!RHASH_AR_TABLE_P(hash))) {
/* `#hash` changes ar_table -> st_table */
return st_delete(RHASH_ST_TABLE(hash), key, value);
}
bin = find_entry(hash, hash_value, *key);
test/ruby/test_hash.rb (作業コピー)
super
end
end
def test_ar2st
# insert
obj = Object.new
obj.instance_variable_set(:@h, h = {})
def obj.hash
10.times{|i| @h[i] = i}
0
end
def obj.inspect
'test'
end
h[obj] = true
assert_equal '{0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9, test=>true}', h.inspect
# delete
obj = Object.new
obj.instance_variable_set(:@h, h = {})
def obj.hash
10.times{|i| @h[i] = i}
0
end
def obj.inspect
'test'
end
def obj.eql? other
other.class == Object
end
obj2 = Object.new
def obj2.hash
0
end
h[obj2] = true
h.delete obj
assert_equal '{0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9}', h.inspect
# lookup
obj = Object.new
obj.instance_variable_set(:@h, h = {})
def obj.hash
10.times{|i| @h[i] = i}
0
end
def obj.inspect
'test'
end
def obj.eql? other
other.class == Object
end
obj2 = Object.new
def obj2.hash
0
end
h[obj2] = true
assert_equal true, h[obj]
end
end
    (1-1/1)