ruby-changes:34640
From: nobu <ko1@a...>
Date: Mon, 7 Jul 2014 00:14:27 +0900 (JST)
Subject: [ruby-changes:34640] nobu:r46723 (trunk): st.c: remove equality checks
nobu 2014-07-07 00:11:53 +0900 (Mon, 07 Jul 2014) New Revision: 46723 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=46723 Log: st.c: remove equality checks * st.c (st_update): remove equality checks, callers should ensure the equality, otherwise the behavior is undefined. Modified files: trunk/include/ruby/st.h trunk/st.c Index: include/ruby/st.h =================================================================== --- include/ruby/st.h (revision 46722) +++ include/ruby/st.h (revision 46723) @@ -115,6 +115,9 @@ int st_insert2(st_table *, st_data_t, st https://github.com/ruby/ruby/blob/trunk/include/ruby/st.h#L115 int st_lookup(st_table *, st_data_t, st_data_t *); int st_get_key(st_table *, st_data_t, st_data_t *); typedef int st_update_callback_func(st_data_t *key, st_data_t *value, st_data_t arg, int existing); +/* *key may be altered, but must equal to the old key, i.e., the + * results of hash() are same and compare() returns 0, otherwise the + * behavior is undefined */ int st_update(st_table *table, st_data_t key, st_update_callback_func *func, st_data_t arg); int st_foreach(st_table *, int (*)(ANYARGS), st_data_t); int st_foreach_check(st_table *, int (*)(ANYARGS), st_data_t, st_data_t); Index: st.c =================================================================== --- st.c (revision 46722) +++ st.c (revision 46723) @@ -843,16 +843,10 @@ st_update(st_table *table, st_data_t key https://github.com/ruby/ruby/blob/trunk/st.c#L843 switch (retval) { case ST_CONTINUE: if (!existing) { - if (key != old_key) hash_val = do_hash(key, table); add_packed_direct(table, key, value, hash_val); break; } - if (old_key != PKEY(table, i)) return -1; if (old_key != key) { - if (do_hash(key, table) != hash_val && - !EQUAL(table, key, old_key)) { - return -1; - } PKEY(table, i) = key; } PVAL_SET(table, i, value); @@ -879,16 +873,10 @@ st_update(st_table *table, st_data_t key https://github.com/ruby/ruby/blob/trunk/st.c#L873 switch (retval) { case ST_CONTINUE: if (!existing) { - if (key != old_key) hash_val = do_hash(key, table); add_direct(table, key, value, hash_val, hash_pos(hash_val, table->num_bins)); break; } - if (old_key != ptr->key) return -1; if (old_key != key) { - if (do_hash(key, table) != hash_val && - !EQUAL(table, key, old_key)) { - return -1; - } ptr->key = key; } ptr->record = value; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/